2014-09-18 3 views
5

저는 Moq을 사용하고 사랑해 왔지만 일부 리거 코드를 조롱하는 문제를 만났습니다 (전에 리팩터링하려고 시도하기 전에)Moq Mock 구현을 복사 할 수 있습니까?

내가 정말로하고 싶은 것은 두 개의 별도 모의가 있습니다. 아래 샘플처럼 약간 다른 구현.

 Mock<IFoo> fooMock = new Mock<IFoo>(); 
     fooMock.SetupGet(f => f.bar).Returns(7); 
     fooMock.SetupGet(f => f.bar2).Returns(3); 
     Mock<IFoo> fooMockClone = new Mock<IFoo>(fooMock.Behavior); 
     fooMockClone.SetupGet(f => f.bar).Returns(9); 

     Debug.Assert(7 == fooMock.Object.bar); 
     Debug.Assert(9 == fooMockClone.Object.bar); 
     Debug.Assert(3 == fooMockClone.Object.bar2); 
     Debug.Assert(3 == fooMock.Object.bar2); 

이것은 간단한 예제이지만 실제 코드는 수십 가지 메소드가있는 객체이며 두 버전에 약간 다른 구현이 필요합니다.

감사합니다.

+0

귀하의 질문 혼란 보인다 - 두 번째 fooMock 설정 및 두 번째 주장와 복사 - 붙여 넣기 "whoopsie"을 있었나요? –

+0

당신은 절대적으로 옳습니다. 나는 그랬다. 결정된. 감사합니다 :) –

+0

잠깐, 당신이 액세스 할 때마다 그 값이 바뀌는 하나의 모의 객체가 필요합니까? –

답변

1

본인은 행동 테스트를 찾고 계신가요? 여기에 Moq 하위 레이어가있는 Machine.Fakes의 샘플이 있습니다. 테스트의 논리적 분리를 유지하면서 원하는대로 중첩시킬 수 있습니다. Machine.Fakes.Moq, 그것은 조롱 동작을 테스트이기 때문에 예를 다소 바보 다시

class IFoo_test_context : WithSubject<IFoo> 
{ 
    Establish context =() => Subject.bar2 = 3; 
} 

class When_fooing_with_seven : IFoo_test_context 
{ 
    Establish context =() => Subject.bar = 7; 

    It bar_should_be_seven =()=> Subject.bar.ShouldEqual(7); 
    It bar2_should_be_three =()=> Subject.bar.ShouldEqual(3); 
} 

class When_fooing_with_nine : IFoo_test_context 
{ 
    Establish context =() => Subject.bar = 9; 

    It bar_should_be_nine =() => Subject.bar.ShouldEqual(9); 
    It bar2_should_be_three =() => Subject.bar.ShouldEqual(3); 
} 

을 Machine.Specifications.Should, 그러나 당신이 궁극적으로 달성하기 위해 노력하고 무엇을 볼 어렵다 : NuGet 패키지가 필요합니다. 내가 말할 수있는 한 모의와 함께 원하는 방식으로 복사 생성자가 없습니다.

+0

수정 한 내용으로 예제를 복사했으며 2014-09-18 현재 NuGet의 Moq 4.2.1409.1722에서 작동했습니다. –

+0

모의가 MockBehaviour.Strict, Loose 또는 Default로 작성된 경우 fooMock.Behaviour가 반환된다고 생각합니다. (실제로 뭘 원하는지 명확하게 보여주기 위해 끔찍한 예제를 업데이트했습니다.) 미안 ...) –

+0

내 대답을 업데이트했습니다. 원래 질문에 대한 편집 내용을 기반으로합니다. –

0

구현 세부 사항을 조롱하지 않으면 코드에서 테스트해야하는 지점으로 이동할 수 있습니다. 조롱 된 종속성이 값을 출력하는지 테스트하는 테스트를 작성하는 데는 아무런 요점이 없습니다. 그러면 moq를 테스트하는 것입니다.

예 :

public class Stuff { 
    IFoo _foo; 
    IBar _bar; 
    public Stuff(IFoo foo, IBar bar){ 
     _foo = foo; 
     _bar = bar; 
    } 
    public void DoStuff() { 
     if(_foo.HasFooage) { 
      _bar.Bar = 4; 
     } 
    } 
} 

그런 다음 테스트 것 :

... 
public void test_bar_does_bar() { 
    var foo = new Mock<IFoo>(); 
    foo.Setup(f => f.HasFooage).Returns(true); 
    var bar = new Mock<IBar>(); 
    var stuff = new Stuff(foo.Object, bar.Object); 

    stuff.DoStuff(); 

    Assert.That(bar.Bar, Is.EqualTo(4)); 
} 
+1

나는 그 점을 놓쳤다 고 생각합니다. OP는 짧은 답을 줄 수있는 지점까지 문제를 추출하려고했습니다. – Michael

+0

자신에게 물어보십시오 : 모의 객체가 특별히 설정 한 값을 가지고 있는지 여부에 대한 debug.assert의 요점은 무엇입니까? –

+0

나는 테스트하고 테스트 한 메서드에 개체를 전달하려고합니다.이 값은 예상대로 설정되어 있습니다. SetProperty를 사용하면 나중에 설정 될 수 있도록 약간 더 명확 해졌습니다. 나는 나의 모범이 여러면에서 끔찍하다는 것을 발견했다. –

관련 문제