【发布时间】:2016-08-24 04:25:42
【问题描述】:
我有一个模拟的类,但在某些情况下我需要运行原始方法
public virtual async Task<int> SaveChangesAsync(string userId)
{
try
{
TrackChanges(userId);//sets some fields
return await db.SaveChangesAsync();
}
catch (Exception e)
{
LogSaveValidationFailed(e);
throw;
}
}
我尝试过CallBase = true,但它不适用于async 方法,还尝试了CallBack 的解决方法...
var db = new Mock<DbContext>();
db.CallBase = true;
db.Setup(x => x.SaveChangesAsync(It.IsAny<string>())).ReturnsAsync(1).Callback((string user) =>
{
db.Object.SaveChanges(user);
});
...它返回值 bud 从不调用回调。
一切正常,但不适用于异步。
我该怎么做才能使它与 Moq 一起使用,或者最好只是重构一下并将 TrackChanges 从异步方法移动到正常方法?
【问题讨论】:
-
IDbContext是类还是接口?CallBase在接口上不起作用... -
固定代码示例,它是一个类
-
为什么要调用原始方法?基本上
SaveChangesAsync在一个新的Task中调用SaveChanges,所以你可以使用真正的DbContext而不是假的......还有一件事你如何验证原来的SaveChanges没有被调用? -
您能解释一下“某些情况下我需要运行原始方法”吗?看起来您正在结合单元测试和集成测试。
-
是的,我这样做,模拟所有外部部件,但我想从头到尾运行我的所有代码,
标签: c# unit-testing asynchronous callback moq