Dan*_*rez 12 .net c# unit-testing moq
我试图用Moq测试一个有"params"列表的方法被调用,但由于某种原因,这是失败的.方法签名是这样的:
void AttachAsModifiedToOrders(IOrder order, params
Expression<Func<IOrder, object>>[] modifiedProperties);
Run Code Online (Sandbox Code Playgroud)
然后在模拟设置中,我做了类似的事情,从模拟集合中做一个简单的"删除/插入":
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); });
Run Code Online (Sandbox Code Playgroud)
最后,验证:
MockEntities.Verify(x => x.AttachAsModifiedToOrders(It.IsAny<Order>(),
It.IsAny<Expression<Func<IOrder, object>>>()), Times.Exactly(1));
Run Code Online (Sandbox Code Playgroud)
我已经检查过了,代码执行正常并调用了方法(模拟的方法),但验证失败了.我错过了什么吗?或者仅仅是Moq不支持这种"params"呼叫?
Rit*_*ton 12
我很难复制这个.我认为您的验证中存在拼写错误:
MockEntities.Verify(x => x.AttachAsModifiedToOrders(It.IsAny<Order>(), It.IsAny<Expression<Func<IOrder, object>>>()), Times.Exactly(1));
Run Code Online (Sandbox Code Playgroud)
应该:
MockEntities.Verify(x => x.AttachAsModifiedToOrders(It.IsAny<Order>(), It.IsAny<Expression<Func<IOrder, object[]>>>()), Times.Exactly(1));
Run Code Online (Sandbox Code Playgroud)
我也想知道第一个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() { }
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个测试夹具来验证params 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());
}
}
Run Code Online (Sandbox Code Playgroud)
这对我有用,所以我不认为问题是params值和Moq直接.我认为你退后一步,看看你是否真的对与模拟交互的类进行单元测试,或者尝试验证几种不同类型的集成用法.参数和表达树也有点气味.
| 归档时间: |
|
| 查看次数: |
7649 次 |
| 最近记录: |