NSubstitute 在使用 ForPartsOf 和模拟异步方法时返回 NullReferenceException
NSubstitute returning NullReferenceException when Using ForPartsOf and mocking an Async Method
我有两个方法:
public class MyClass
{
public virtual async Task MethodOne(MyModel myModel)
{
await Task.Delay(1);
throw new Exception("Test");
}
public async Task MethodTwo()
{
MyModel myModel = new MyModel();
await MethodOne(myModel);
}
}
MyModel 是什么并不重要,重要的是它是一个参数。
测试:
[Fact]
public async Task Test6()
{
// Arrange
MyClass myClass = Substitute.ForPartsOf<MyClass>();
myClass.When(async a => await a.MethodOne(Arg.Any<MyModel>())).DoNotCallBase();
// Act
await myClass.MethodTwo();
// Assert
}
测试给出 NullReferenceException
当行:
myClass.When(async a => await a.MethodOne(Arg.Any<MyModel>())).DoNotCallBase();
我的猜测是它在某种程度上试图解决 MyModel
;但是,在同步方法或没有复杂参数的方法上执行时,相同的测试有效。
谁能告诉我为什么会出现这种错误?
不要等待设置
覆盖的方法需要 return 一个 Task
以允许异步在测试中调用时完成。
这意味着需要重写设置
[Fact]
public async Task Test6() {
// Arrange
var myClass = Substitute.ForPartsOf<MyClass>();
myClass.MethodOne(Arg.Any<MyModel>()).Returns(Task.FromResult((object)null));
// Act
await myClass.MethodTwo();
// Assert
//...
}
我有两个方法:
public class MyClass
{
public virtual async Task MethodOne(MyModel myModel)
{
await Task.Delay(1);
throw new Exception("Test");
}
public async Task MethodTwo()
{
MyModel myModel = new MyModel();
await MethodOne(myModel);
}
}
MyModel 是什么并不重要,重要的是它是一个参数。
测试:
[Fact]
public async Task Test6()
{
// Arrange
MyClass myClass = Substitute.ForPartsOf<MyClass>();
myClass.When(async a => await a.MethodOne(Arg.Any<MyModel>())).DoNotCallBase();
// Act
await myClass.MethodTwo();
// Assert
}
测试给出 NullReferenceException
当行:
myClass.When(async a => await a.MethodOne(Arg.Any<MyModel>())).DoNotCallBase();
我的猜测是它在某种程度上试图解决 MyModel
;但是,在同步方法或没有复杂参数的方法上执行时,相同的测试有效。
谁能告诉我为什么会出现这种错误?
不要等待设置
覆盖的方法需要 return 一个
Task
以允许异步在测试中调用时完成。
这意味着需要重写设置
[Fact]
public async Task Test6() {
// Arrange
var myClass = Substitute.ForPartsOf<MyClass>();
myClass.MethodOne(Arg.Any<MyModel>()).Returns(Task.FromResult((object)null));
// Act
await myClass.MethodTwo();
// Assert
//...
}