2014-11-09 3 views
0

다음 메소드를 사용하여 테스트하려고하지만 변수를 설정하려고해도 변수가 null입니다.Moq가 메소드 내에서 변수를 설정하는 경우

 public void Cancel(Guid id) 
     { 
      var order = _orderRepository.Find(o => o.Id == id); ** This never gets set, even with the setup below.** 
      if (order == null) return; ** Test Fails here. Returns and all assertions fails.** 

      order.Status = OrderStatus.Cancelled; 
      _orderRepository.Update(order); 
     } 

     [SetUp] 
     public void Setup() 
     { 
      _orderRepositoryMock = new Mock<IRepository<Order>>(); 
      _accountServiceMock = new Mock<IAccountService>(); 

      _orderService = new OrderService(_accountServiceMock.Object, _orderRepositoryMock.Object); 

      order = new Order() 
      { 
       Id = Guid.NewGuid(), 
       Customer= new ApplicationUser() 
       { 
        Id = Guid.NewGuid().ToString(), 
        Email = "[email protected]", 
        FirstName = "Tester", 
        LastName = "Test", 
        Address = "123 45 Ave", 
        City = "ABCVille", 
        PhoneNumber = "1-888-888-8888", 
        PostalCode = "T3J 0A4", 
        Province = "Super" 
       }, 
       OrderAddons = new List<OrderAddon>(), 
       Total = 363.99m, 
       Status = OrderStatus.Created 
      }; 
     } 

    [Test] 
    public void CancelShouldCallRepositoryWhenValid() 
    { 
     //var order ... (test data, in setUp) 
     var id = Guid.NewGuid(); 
     order.Id = id; 

     // Repository Setup 
     _orderRepositoryMock.Setup(x => x.Find(o => o.Id == id)).Returns(order); 

     var wasOrderStatusUpdatedCorrectly = false; 
     _orderRepositoryMock.Setup(x => x.Update(order)) 
      .Callback((Order o) => 
      { 
       wasOrderStatusUpdatedCorrectly = o.Status == OrderStatus.Cancelled; 
      }); 

     // Test Service 
     _orderService.Cancel(id); 

     // Test Assertions 
     _orderRepositoryMock.Verify(x => x.Find(o => o.Id == It.IsAny<Guid>()), Times.Once); 
     _orderRepositoryMock.Verify(x => x.Update(order), Times.Once); 
    } 

어쨌든 "var order"를 테스트 할 수 있습니까? 나는 SetupGet도 시도해 보았고, 작동하지 않는 것처럼 보였습니다. Moq은 나에게 새로운 것이므로, 이것이 간단하고 쉬운 일이라면 사전에 용서하십시오.

+0

'주문'은 테스트하고 싶은가요? –

+0

'_orderRepositoryMock.Object'를 서비스에 삽입하는 방법이 명확하지 않습니다. 아니면? 테스트하려는 서비스가 _orderService라면 조롱하지 마십시오. 의존성 만 있습니다. 실제 안내와 함께 취소를 호출하십시오 (예 : Guid.NewGuid(). –

+0

나는 그것을 시험해보고 싶다. 마음이 열렸다. 문제는 테스트 순서를 디버깅 할 때 모의 설정을하더라도 항상 null입니다. – devfunkd

답변

1

이 문제는 저장소의 Find 메서드가 예상하는 Expression이라고 생각합니다. 난 그냥 Expression<>의 형식 매개 변수에 같은데요

_orderRepositoryMock 
    .Setup(x => x.Find(It.IsAny<Expression<Func<Order, bool>>>())) 
    .Returns(order); 

을, 그러나 희망이 도움이 : 대신 사용해보십시오.

+0

+1 빠른 답변을 위해, 감사합니다. :) – devfunkd

+1

예! 하나의 ['Expression '] (http://msdn.microsoft.com/en-us/library/bb335710.aspx) 인스턴스는 두 개의 동일한 화살표로 정의 된 경우에도 다른 '표현식 '과 동일 할 필요는 없습니다 'o => o.Id == id'. 내가 볼 수있는 한'Expression <> '또는 그 기본 클래스 중 어느 것도'bool Equals (object)'메소드를 오버라이드하지 않습니다. 그래서 문제는'Setup'이 실제 호출에 사용 된 표현식 트리와 "같지"않은 표현 트리 ('Setup' 표현식 트리의 하위 표현식)를 보았습니다. 그런 다음 Moq은 기본 동작으로 되돌아갔습니다.이 동작은'default (Order)', 즉'null '을 반환합니다. –

+0

위대한 설명! 고맙습니다. – devfunkd

관련 문제