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 напрямую. Я думаю, вам было бы неплохо сделать шаг назад и посмотреть, действительно ли вы тестируете класс, который взаимодействует с макетом, или пытаетесь проверить интегрированные обычаи пары различные формы. Парамы и дерево выражений также немного пахнут.