기본적으로 모의은 진짜가 아니므로 실제 행동이 아닙니다. 그것은 실제 행동을 취하기로되어 있지 않습니다 - 일어난 일을 추적하면서 당신이 말한대로해야합니다. 아무것도 더 많지도 덜합니다.
즉, 은 복사 방법이 어떻게 작동하는지 알려야합니다. 당신이 implmementation의 다음, 을 할 경우 복사 방법이있을 것이다 : 그러나
Mock<IDataSet> dataMock = new Mock<IDataSet>();
Mock<IDataSet> copyMock = new Mock<IDataSet>();
dataMock.Setup(c => c.Copy()).Returns(copyMock.Object);
을, 당신은 또한이 작업을 수행 할 수 있습니다는, 다음의 구현이되는 것을
Mock<IDataSet> dataMock = new Mock<IDataSet>();
Mock<IDataSet> copyMock = dataMock;
dataMock.Setup(c => c.Copy()).Returns(copyMock.Object);
및 을 Copy 메서드. 기억하십시오 : 인터페이스는 메소드가 수행해야하는 것을 설명하는 계약이 아닙니다. 메소드의 서명 만 정의합니다.
하나의 IDataSet에서 다른 IDataSet으로 데이터를 복사하고 싶지만 Mock은 순수한 동작이라는 것을 기억하십시오. 데이터가 없습니다.
당신에 대해 생각할 수있는 대안 중 몇은 다음과 같습니다
- 는 추상 DataSetBase 클래스와 IDataSet을 교체하고 당신이 그것을 행동 할 같이 복사 방법을 구현 (즉, AS를 하지입니다 추상 또는 가상 방법).
- 모의 IDataSet을 만드는 대신 Fake를 사용하십시오. A Fake는 실재에 가까운 행동을하는 인터페이스의 테스트 지정 구현입니다. 가짜를 만들기위한 프레임 워크/라이브러리가 없으므로 이러한 가짜 코드를 직접 작성해야합니다.
- Copy 메서드가 실제로 인터페이스의 일부인지 여부를 고려하십시오. 그것은 처음에는 인터페이스에 속하지 않는 구현 세부 사항처럼 나에게 들립니다.
우수 서적 xUnit Test Patterns에서 스텁, 모의, 가짜 및 기타 단위 테스트 디자인 패턴을 읽을 수 있습니다.
귀하의 통찰력에 감사드립니다. "dataMock"을 가짜로 전환하면 내가 속한 막 다른 골목에서 빠져 나왔습니다. –
+1 - 좋은 답변입니다! 저는 Moq이 Fakes를 만들 수 있다고 주장 할 것입니다. 왜냐하면 Return (Func)이나 Callback (Action)을 할 수 있기 때문입니다. 하지만 수동 가짜는 더 읽기 쉽습니다. – TrueWill
@TrueWill : 유효 지점이지만, 가장 중요한 것은 다른 컨텍스트에서 만든 포인트를 보여줍니다. Test Doubles는 막연하게 정의 된 연속체에 살고 있습니다. http://msdn.microsoft.com/en-us/magazine/cc163358.aspx –