Странная ошибка "Ожидаемый вызов на макет хотя бы один раз, но никогда не выполнялся" при настройке макета - PullRequest
0 голосов
/ 26 октября 2011

Я получаю эту ошибку от Moq через NUnit, и она не имеет для меня большого смысла.

"Ожидаемый вызов на макет хотя бы один раз, но никогда не выполнялся:x => x.DeleteItem (. $ VB $ Local_item) "

" в Moq.Mock.ThrowVerifyException (ожидается MethodCall, IEnumerable 1 setups, IEnumerable 1 actualCalls, выражение Expression, Times times, Int32 callCount) в Moq.Mock.VerifyCalls (Interceptor targetInterceptor, ожидаемый MethodCall, выражение Expression, времена Times) в Moq.Mock.Verify [T] (Mock mock, Expression 1 expression, Times times, String failMessage) at Moq.Mock 1.Verify (выражение Expression`1) в PeekABookEditor.UnitTests.ItemBrowsing.Can_Delete_I() в C: \ Projects \ MyProject \ MyProject.UnitTests \ Tests \ ItemBrowsing.vb: строка 167 "

Очень похожий код хорошо работает в C #, поэтому ошибка может быть незначительной и синтаксической с моей стороны.

Вот мой код:

    <Test()> _
Public Sub Can_Delete_Item()
    'Arrange: Given a repository containing some item...
    Dim mockRepository = New Mock(Of IItemsRepository)()
    Dim item As New Item With {.ItemID = "24", .Title = "i24"}

    mockRepository.Setup(Function(x) x.Items).Returns(New Item() {item}.AsQueryable())

    'Act ... when the user tries to delete that product
    Dim controller = New ItemsController(mockRepository.Object)
    Dim result = controller.Delete(24)

    'Assert ... then it's deleted, and the user sees a confirmation
    mockRepository.Verify(Sub(x) x.DeleteItem(item))
    result.ShouldBeRedirectionTo(New With {Key .action = "List"})
    Assert.AreEqual(DirectCast(controller.TempData("message"), String), "i24 was deleted")

End Sub

Кажется, что виновной является строка «mockRepository.Verify (Sub (x) x.DeleteItem (item))»

Любые мысли окак это исправить?

WorkiКод C # не совсем такой, но вот он:

[Test] 
public void Can_Delete_Product() 
{ 
// Arrange: Given a repository containing some product... 
var mockRepository = new Mock<IProductsRepository>(); 
var product = new Product { ProductID = 24, Name = "P24"}; 
mockRepository.Setup(x => x.Products).Returns( 
    new[] { product }.AsQueryable() 
); 

// Act: ... when the user tries to delete that product 
var controller = new AdminController(mockRepository.Object); 
var result = controller.Delete(24); 

// Assert: ... then it's deleted, and the user sees a confirmation
mockRepository.Verify(x => x.DeleteProduct(product)); 
result.ShouldBeRedirectionTo(new { action = "Index" }); 
controller.TempData["message"].ShouldEqual("P24 was deleted"); 

}

1 Ответ

0 голосов
/ 26 октября 2011

В вашем методе тестирования VB вы создаете Item со строкой ItemID = "24", но вызываете метод controller.Delete с целочисленным значением 24.

Проверьте код контроллера и посмотрите, приводит ли это несоответствие типов к элементу, который не был идентифицирован правильно, поэтому либо DeleteItem вообще не вызывается, либо вызывается с другим Item.

...