Rhino Mocks 예외 "예상 # 1, 실제 # 0"작동하는 코드

작동하는 MVVM에 대한 오래된 책의 코드가 있지만 Rhino Mocks를 사용한 테스트는 다음 메시지와 함께 실패합니다.

테스트 메서드 TestProject.UnitTest1.UpdateCustomer_Always_CallsUpdateWithCustomer에서 예외가 발생했습니다. Rhino.Mocks.Exceptions.ExpectationViolationException : DataProvider.DoSomething (ConsoleApp.Customer); 예상 # 1, 실제 # 0

나는 동등하다고 생각하는 예를 제공하고 있습니다.

namespace ConsoleApp {
    class Program { static void Main () { } }

    public class Customer { public string ID { get; set; } }

    public class DataProvider {
        public virtual Customer GetCustomer (string id) => new Customer ();
        public virtual void DoSomething (Customer customer) { }
    }

    public class ViewModel {
        DataProvider _dataProvider;
        Customer _customer;

        public ViewModel (DataProvider dataProvider, string id) {
            _dataProvider = dataProvider;
            _customer = new Customer { ID = id };
        }

        public void DoSomething () => _dataProvider.DoSomething (_customer);
    }
}

그리고 실패한 테스트

namespace TestProject {
    [TestClass]
    public class UnitTest1 {
        [TestMethod]
        public void UpdateCustomer_Always_CallsUpdateWithCustomer () {
            DataProvider dataProviderMock = MockRepository.GenerateMock<DataProvider> ();
            Customer expectedCustomer = new Customer ();
            dataProviderMock.Stub (u => u.GetCustomer (Arg<string>.Is.Anything)).Return (expectedCustomer);
            ViewModel target = new ViewModel (dataProviderMock, string.Empty);
            target.DoSomething ();
            dataProviderMock.AssertWasCalled (d => d.DoSomething (expectedCustomer));
        }
    }
}

이 결과에 대한 여러 게시물 (예 : 12)을 읽었 지만 도움이되지 않습니다. 흥미로운 답변읽었습니다 .

일반적으로 테스트에서 빌드 한 개체 인수를 사용하여 스텁 메서드를 호출하고 테스트 된 코드에서 해당 메서드를 호출하기 전에 개체가 빌드되면이 오류가 발생합니다.

이것이 Rhino Mocks가 실패하는 이유 일 수 있지만 버그 인 것 같습니다.

내 질문은 : 내 테스트에 문제가 있고 Rhino Mocks에 버그가 있거나 내 코드에 문제가 있습니까?

Nkosi

테스트 스텁 DataProvider.GetCustomer은 어설 션에 사용될 예상 고객 인스턴스를 반환하지만 예제 뷰 모델은 DataProvider.GetCustomer.

생성자에서 초기화 된 것을 사용하고 있습니다.

//...

public ViewModel (DataProvider dataProvider, string id) {
    _dataProvider = dataProvider;
    _customer = new Customer { ID = id };
}

//...

따라서 테스트에서 발생한 예외는 표시된 예제에서 정확합니다.

이는 뷰 모델이 사용하는 실제 인스턴스가 테스트를 실행할 때 어설 션에 사용되는 인스턴스가 아니기 때문입니다.

//...

dataProviderMock.AssertWasCalled (d => d.DoSomething (expectedCustomer));

테스트가 배열에 따라 예상대로 작동하려면 뷰 모델이 실제로 리팩토링되어 초기화에서 분리되어야합니다. Customer

예를 들면

public class ViewModel {
    DataProvider _dataProvider;
    string id;

    public ViewModel (DataProvider dataProvider, string id) {
        _dataProvider = dataProvider;
        this.id = id;
    }

    public void DoSomething () {
        Customer customer = _dataProvider.GetCustomer(id);
        _dataProvider.DoSomething (_customer);
    }
}

테스트는 또한 테스트하려는 대상에 대해 더 명확해야합니다.

[TestClass]
public class UnitTest1 {
    [TestMethod]
    public void UpdateCustomer_Always_CallsUpdateWithCustomer () {
        //Arrange
        DataProvider dataProviderMock = MockRepository.GenerateMock<DataProvider> ();
        string id = "FakeId";
        Customer expectedCustomer = new Customer { ID = id };
        dataProviderMock.Stub (u => u.GetCustomer (id))
            .Return (expectedCustomer);
        ViewModel target = new ViewModel (dataProviderMock, id);

        //Act
        target.DoSomething ();

        //Assert
        dataProviderMock.AssertWasCalled (d => d.DoSomething (expectedCustomer));
    }
}

또는 뷰 모델이 의도 한대로라면 테스트는 기대치를 다르게 주장해야합니다.

[TestClass]
public class UnitTest1 {
    [TestMethod]
    public void UpdateCustomer_Always_CallsUpdateWithCustomer () {
        //Arrange
        DataProvider dataProviderMock = MockRepository.GenerateMock<DataProvider> ();
        string id = "FakeId";            
        ViewModel target = new ViewModel (dataProviderMock, id);

        //Act
        target.DoSomething ();

        //Assert
        dataProviderMock
            .AssertWasCalled (d => d.DoSomething (Arg<Customer>.Matches(c => c.ID == id));
    }
}

호출 될 때 전달 된 특정 인스턴스 대신 예상 인수의 특성을 확인하기 위해 어설 션에 사용 된 대리자를 참고하십시오.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Rhino Mocks의 반환 값에 예상되는 매개 변수를 전달하는 방법은 무엇입니까?

분류에서Dev

Rhino Mocks에서 null 인수를 사용하여 메서드를 스텁하는 방법은 무엇입니까?

분류에서Dev

Rhino Mocks를 사용하여 저장소 개체의 스터 빙 함수 표현

분류에서Dev

예외 클래스 코드가 작동하지 않습니다.

분류에서Dev

Rhino-mocks 단위 테스트

분류에서Dev

Rhino mocks에서 FirstOrDefault를 조롱

분류에서Dev

작동하는 XML 피드, 블로거는 예외입니까?

분류에서Dev

작업 항목 저장소를 빌드하는 동안 예외

분류에서Dev

SQL 예외 코드

분류에서Dev

C # 코드 예외

분류에서Dev

C #에서 JS 코드 실행 예외 : 예상되는 함수

분류에서Dev

Rhino Mocks 또는 StructureMap AutoMocks 동일 / 상속 클래스에서 함수를 스텁하는 방법은 무엇입니까?

분류에서Dev

jdbc를 사용하는 DB2 SQL 예외 코드 440

분류에서Dev

코드에서 db를 호출하는 netBeans 및 ucanacces SQL 예외

분류에서Dev

새 레코드 예외 처리를 삽입하는 PL / SQL

분류에서Dev

이 코드에서 예외가 발생하는 이유

분류에서Dev

예상대로 작동하지 않는 JS 코드

분류에서Dev

예상대로 작동하지 않는 간단한 Java 코드

분류에서Dev

Rhino에서 V8 용 코드를 어떻게 다시 작성합니까?

분류에서Dev

작은 코드 예

분류에서Dev

레코드가 "deleted.inFlight"인 동안 ember-data 예외

분류에서Dev

비동기 코드에서 예외 디버깅

분류에서Dev

코드를 컴파일 할 때 동시 수정 예외,

분류에서Dev

자바 예외 : 반복되는 코드를 줄이는 방법

분류에서Dev

내 코드는 그러한 요소 예외가 없습니다.

분류에서Dev

C 코드에서 R 예외 신호를 보내는 방법

분류에서Dev

서버 측에 PHP 코드가있는 Android의 JSON 예외

분류에서Dev

예외를 일으키지 만 500 코드는 아님-Rails

분류에서Dev

OOM 예외가없는 경우 Docker 작성 종료 코드는 137입니다.

Related 관련 기사

  1. 1

    Rhino Mocks의 반환 값에 예상되는 매개 변수를 전달하는 방법은 무엇입니까?

  2. 2

    Rhino Mocks에서 null 인수를 사용하여 메서드를 스텁하는 방법은 무엇입니까?

  3. 3

    Rhino Mocks를 사용하여 저장소 개체의 스터 빙 함수 표현

  4. 4

    예외 클래스 코드가 작동하지 않습니다.

  5. 5

    Rhino-mocks 단위 테스트

  6. 6

    Rhino mocks에서 FirstOrDefault를 조롱

  7. 7

    작동하는 XML 피드, 블로거는 예외입니까?

  8. 8

    작업 항목 저장소를 빌드하는 동안 예외

  9. 9

    SQL 예외 코드

  10. 10

    C # 코드 예외

  11. 11

    C #에서 JS 코드 실행 예외 : 예상되는 함수

  12. 12

    Rhino Mocks 또는 StructureMap AutoMocks 동일 / 상속 클래스에서 함수를 스텁하는 방법은 무엇입니까?

  13. 13

    jdbc를 사용하는 DB2 SQL 예외 코드 440

  14. 14

    코드에서 db를 호출하는 netBeans 및 ucanacces SQL 예외

  15. 15

    새 레코드 예외 처리를 삽입하는 PL / SQL

  16. 16

    이 코드에서 예외가 발생하는 이유

  17. 17

    예상대로 작동하지 않는 JS 코드

  18. 18

    예상대로 작동하지 않는 간단한 Java 코드

  19. 19

    Rhino에서 V8 용 코드를 어떻게 다시 작성합니까?

  20. 20

    작은 코드 예

  21. 21

    레코드가 "deleted.inFlight"인 동안 ember-data 예외

  22. 22

    비동기 코드에서 예외 디버깅

  23. 23

    코드를 컴파일 할 때 동시 수정 예외,

  24. 24

    자바 예외 : 반복되는 코드를 줄이는 방법

  25. 25

    내 코드는 그러한 요소 예외가 없습니다.

  26. 26

    C 코드에서 R 예외 신호를 보내는 방법

  27. 27

    서버 측에 PHP 코드가있는 Android의 JSON 예외

  28. 28

    예외를 일으키지 만 500 코드는 아님-Rails

  29. 29

    OOM 예외가없는 경우 Docker 작성 종료 코드는 137입니다.

뜨겁다태그

보관