2009-08-18 4 views
4

테스트 목적으로 System.Data.DataSet 앞에 인터페이스 (IDataSet)를 사용하고 있습니다. Copy() 메서드를 조롱 할 수 있어야합니다. 기본적으로 같은 mocked 객체의 복사/복제를 원합니다.Moq Mock <> 값을 복사하는 방법이 있습니까?

다음은 내가하고 싶은 의사 코드입니다.

Mock<IDataSet> dataMock = new Mock<IDataSet>(); 
Mock<IDataSet> copyMock = ??? // How do I clone the mock? 

dataMock.Setup(c => c.Copy()).Returns(copyMock.Object); 

이것은 가능합니까?

답변

4

기본적으로 모의은 진짜가 아니므로 실제 행동이 아닙니다. 그것은 실제 행동을 취하기로되어 있지 않습니다 - 일어난 일을 추적하면서 당신이 말한대로해야합니다. 아무것도 더 많지도 덜합니다.

즉, 은 복사 방법이 어떻게 작동하는지 알려야합니다. 당신이 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에서 스텁, 모의, 가짜 및 기타 단위 테스트 디자인 패턴을 읽을 수 있습니다.

+0

귀하의 통찰력에 감사드립니다. "dataMock"을 가짜로 전환하면 내가 속한 막 다른 골목에서 빠져 나왔습니다. –

+0

+1 - 좋은 답변입니다! 저는 Moq이 Fakes를 만들 수 있다고 주장 할 것입니다. 왜냐하면 Return (Func)이나 Callback (Action)을 할 수 있기 때문입니다. 하지만 수동 가짜는 더 읽기 쉽습니다. – TrueWill

+1

@TrueWill : 유효 지점이지만, 가장 중요한 것은 다른 컨텍스트에서 만든 포인트를 보여줍니다. Test Doubles는 막연하게 정의 된 연속체에 살고 있습니다. http://msdn.microsoft.com/en-us/magazine/cc163358.aspx –

관련 문제