Moq-проверка вызова метода, имеющего значение params

Я пытаюсь проверить с Moq, что метод, который имеет список "params", называется, но по какой-то причине это не удается. Сигнатура метода выглядит примерно так:

void AttachAsModifiedToOrders(IOrder order, params 
       Expression<Func<IOrder, object>>[] modifiedProperties);

затем в макете настройки я сделал что-то вроде этого, чтобы сделать простой "удалить / вставить" из издевательской коллекции :

MockEntities.Setup(n => n.AttachAsModifiedToOrders(It.IsAny<DataAccess.Order>()))
    .Callback<IOrder, Expression<Func<IOrder, object>>[]>((order, expr) => 
      { Orders.Remove(Orders.Where(o => o.Id== order.Id).First()); 
      Orders.Add((DataAccess.Order)order); });

наконец, проверки :

MockEntities.Verify(x => x.AttachAsModifiedToOrders(It.IsAny<Order>(), 
     It.IsAny<Expression<Func<IOrder, object>>>()), Times.Exactly(1));

Я проверил, и код выполняется нормально, и метод вызывается (издевательский), но проверка не проводится. я что-то пропустила? или просто этот вызов "params" не поддерживается Moq?

1 ответов


мне было трудно воспроизвести это. Я думаю, что в вашей проверке есть опечатка:

MockEntities.Verify(x => x.AttachAsModifiedToOrders(It.IsAny<Order>(), It.IsAny<Expression<Func<IOrder, object>>>()), Times.Exactly(1));

должно быть:

MockEntities.Verify(x => x.AttachAsModifiedToOrders(It.IsAny<Order>(), It.IsAny<Expression<Func<IOrder, object[]>>>()), Times.Exactly(1));

мне также интересно, если первый это.IsAny должен быть интерфейсом, а не конкретным типом?

однако это слишком сложный тест некоторой функциональности, и в образце кода отсутствует несколько частей, таких как тип DataAccess или экземпляр класса (не уверен?), Порядок и приказы.

чтобы обойти это, я создал Интерфейс IOrder и объект манипулятора, который использует интерфейс, это немного бессмысленно, но он управляет тестом:

public interface IOrder
{
    void AttachAsModifiedToOrders(IOrder order, params Expression<Func<IOrder, object[]>>[] modifiedProperties);

}

public class Manipulator
{
    public Manipulator(IOrder order)
    {
        Expression<Func<IOrder, object[]>> exp = o => new object[0];
        order.AttachAsModifiedToOrders(order, exp);
    }

    public void DoStuff() { }
}

затем я создал тестовое приспособление для проверки параметров arg:

[TestFixture]
public class Tester
{
    [Test]
    public void Test()
    {
        var order = new Mock<IOrder>();
        order.Setup(n => n.AttachAsModifiedToOrders(It.IsAny<IOrder>()));

        var manipulator = new Manipulator(order.Object);
        manipulator.DoStuff();

        order.Verify(x => x.AttachAsModifiedToOrders(It.IsAny<IOrder>(), It.IsAny<Expression<Func<IOrder, object[]>>>()), Times.Once());
    }
}

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