나는 다음과 같은 시험이 있습니다이 가능 제네릭 형식을 취하는 형태의 더미 객체를 매개 변수 만드는 것입니다
[Fact]
public void StartProgram_CallsZoneProgramStart()
{
var zone = A.Fake<Zone>();
zone.StartProgram();
A.CallTo(() => zone.ZoneProgram.Start(null, A.Dummy<ActionBlock<InterruptInfo>>())).MustHaveHappened(Repeated.Exactly.Once);
}
그것은 MustHaveHappened 호출로 전달되는 유형 ActionBlock<InterruptInfo>
의 더미를 만드는 것 . Zone.StartProgram은 확실히 zone.ZoneProgram.Start 메서드를 호출하지만,이 호출은 FakeItEasy에서 볼 수 없습니다. 그것은 다음과 같은 오류 메시지를 반환
으로 오류 메시지에서 볼 수 에서, ActionBlocks의 ID가 비교되는
Assertion failed for the following call:
ZoneLighting.ZoneProgramNS.ZoneProgram.Start(<NULL>, ActionBlock\`1 Id=1)
Expected to find it exactly once but found it #0 times among the calls:
1: ZoneLighting.ZoneProgramNS.ZoneProgram.Start(inputStartingValues: Faked ZoneLighting.ZoneProgramNS.InputStartingValues, interruptQueue: ActionBlock`1 Id=2)
2: ZoneLighting.ZoneProgramNS.ZoneProgram.Start(inputStartingValues: <NULL>, interruptQueue: ActionBlock`1 Id=2)
는 다르다 (1, 2), 이는 만든. 내 질문은, 왜 dummied ActionBlock의 ID = 1입니까? 나는 가짜 객체라고 생각했는데, ID와 같이 구체적인 세부 사항을 포함해서는 안됩니다. 제네릭 타입을 거짓말 할 수 없기 때문에 이것이 무엇입니까?
나는 여기에 비슷한 보았다
https://github.com/FakeItEasy/FakeItEasy/issues/402
을하지만 그 같은 일이 아닌지에 대해서 이야기하면 알아낼 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다.
자세한 답변을 보내 주셔서 감사합니다. 나는 인봉 된 강좌가 이런 식으로 머무를 수 없다는 것을 몰랐다. 그래서 나의 후속 질문은 다음과 같습니다. 테스트 관점에서, 더미를 사용하거나 .Ignored 기법을 사용하는지 어떻게 알 수 있습니까? 두 경우 모두 유형이 필요하지만 객체의 실제 동작은 중요하지 않습니다 (회신에서 더미 문서 참조). – Anshul
테스트중인 객체를 반 패턴으로 위장하는 것에 관해서는 왜 그런 경우입니까? 만약 우리가 단지 객체의 "배관 공사 (plumbing)"를 테스트하여 연결되어야 할 부분이 메쏘드 호출의 측면에서 연결되어 있는지 확인한다면 어떨까요? 객체를 위조하지 않고 이것을 테스트하는 방법은 무엇입니까? – Anshul
'Ignored'는 호출에 전달 된 인수가 중요하지 않을 때 사용됩니다. 일반적으로 호출 일치 의미론의 경우 [Argument Constraints] (https://github.com/FakeItEasy/FakeItEasy/wiki/Argument-Constraints) 기술을 사용할 수 있습니다. 한 번 생성 된 더미는 다른 것과 마찬가지로 객체이므로 'A.CallTo'에 제공하면'Equals'를 사용하여 실제 인수와 비교하게됩니다. 비교를 "true"라고 말하고 싶다면 답에 대해 신경 써야합니다. 따라서 더미는 나쁜 선택입니다. 일이 생기더라도, 왜 그렇게 명확하지 않을 것입니다. –