Мне было трудно воспроизвести это. Я думаю, что в вашей проверке есть опечатка:
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));
Мне также интересно, должен ли первый It.IsAny быть интерфейсом, а не конкретным типом?
Однако это слишком сложный тест некоторой функциональности, и в примере кода не хватает нескольких фрагментов, таких как тип DataAccess или экземпляр класса (не уверены?), Order и Orders.
Чтобы обойти это, я создал интерфейс 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());
}
}
Это работает для меня, поэтому я не думаю, что проблема заключается в значении params и Moq напрямую. Я действительно думаю, что вам лучше сделать шаг назад и посмотреть, действительно ли вы проводите модульное тестирование класса, взаимодействующего с Mock, или пытаетесь проверить интегрированное использование пары различных типов. Дерево параметров и выражений тоже немного пахнет.