2014-11-09 4 views
0

У меня есть следующий метод, который я пытаюсь проверить, но мои переменные равны нулю, даже если я пытаюсь их настроить.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); 
    } 

Нужно ли все-таки протестировать «порядок варрантов»? Я тоже попробовал SetupGet и, похоже, не работал, Moq для меня новичок, поэтому простите меня заранее, если это что-то простое и легкое.

+0

Как насчет 'order' вы хотите протестировать? –

+0

Непонятно, как вы вводите '_orderRepositoryMock.Object' в свою службу. Или вы? Если это _orderService, который вы пытаетесь протестировать, то вы не издеваетесь над этим, только его зависимость. Поэтому вызовите Cancel с помощью фактического guid, например. Guid.NewGuid(). –

+0

Я пытаюсь проверить, что .Find был вызван. Проблема в том, что когда я отлаживаю тестовый заказ, всегда равен нулю, даже если я настраиваю макет. – devfunkd

ответ

1

Я думаю, что проблема заключается в Expression, который рассчитывает метод Find репозитория. Попробуйте вместо этого:

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

Я просто угадывая параметра типа для Expression<>, но, надеюсь, что помогает.

+0

+1 для быстрого ответа, спасибо. :) – devfunkd

+1

Да! Один экземпляр [Expression '] (http://msdn.microsoft.com/en-us/library/bb335710.aspx) не должен быть« равен »другому« выражению », даже если оба они определены одной и той же стрелкой 'o => o.Id == id'. Ни выражение «<выражение», ни какой-либо из его базовых классов не переопределяют метод «bool Equals (object)», насколько я могу видеть. Таким образом, проблема заключалась в том, что 'Setup' видел дерево выражений (в качестве подвыражения дерева выражений' Setup'), которое не было «равно» дереву выражений, используемому в фактическом вызове. Затем Moq вернулась к по умолчанию, которая возвращает 'default (Order)', т. Е. 'Null'. –

+0

Отличное объяснение! Спасибо. – devfunkd

Смежные вопросы