异步方法的最小起订量调用库不起作用
Moq callbase for async methods don't work
我有 class 被嘲笑但在某些情况下我需要 运行 原始方法
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);
});
...它 returns 价值芽从不调用回调。
一切正常,但不适用于异步。
我该怎么做才能让它与 Moq 一起工作,或者最好只是重构一下并将 TrackChanges
从异步方法移动到正常方法?
我知道文档说你可以
db.CallBase = true
但我自己从未使用过这种方法。这就是我部分模拟 class 的方式,效果很好。
[TestClass]
public class MyClassTest
{
[TestMethod]
public async Task MyClass_ReturnsCorrectValues()
{
// Arrange
var m = new Mock<MyClass>();
m.Setup(x => x.IsKing())
.Returns(Task.FromResult(true));
m.Setup(x => x.IsQueen())
.CallBase();
// Act
var isKing = await m.Object.IsKing();
var isQueen = await m.Object.IsQueen();
// Assert
Assert.IsTrue(isKing); // true
Assert.IsFalse(isQueen); // false
}
}
public class MyClass
{
public virtual async Task<bool> IsKing()
{
return await Task.FromResult(false);
}
public virtual async Task<bool> IsQueen()
{
return await Task.FromResult(false);
}
}
heh 实际上 db.CallBase = true 它可以工作,但是当还有 db.setup().callbase()
时它会失败
我有 class 被嘲笑但在某些情况下我需要 运行 原始方法
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);
});
...它 returns 价值芽从不调用回调。
一切正常,但不适用于异步。
我该怎么做才能让它与 Moq 一起工作,或者最好只是重构一下并将 TrackChanges
从异步方法移动到正常方法?
我知道文档说你可以
db.CallBase = true
但我自己从未使用过这种方法。这就是我部分模拟 class 的方式,效果很好。
[TestClass]
public class MyClassTest
{
[TestMethod]
public async Task MyClass_ReturnsCorrectValues()
{
// Arrange
var m = new Mock<MyClass>();
m.Setup(x => x.IsKing())
.Returns(Task.FromResult(true));
m.Setup(x => x.IsQueen())
.CallBase();
// Act
var isKing = await m.Object.IsKing();
var isQueen = await m.Object.IsQueen();
// Assert
Assert.IsTrue(isKing); // true
Assert.IsFalse(isQueen); // false
}
}
public class MyClass
{
public virtual async Task<bool> IsKing()
{
return await Task.FromResult(false);
}
public virtual async Task<bool> IsQueen()
{
return await Task.FromResult(false);
}
}
heh 实际上 db.CallBase = true 它可以工作,但是当还有 db.setup().callbase()
时它会失败