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;但是,在同步方法或没有复杂参数的方法上执行时,相同的测试有效。

谁能告诉我为什么会出现这种错误?

  1. 不要等待设置

  2. 覆盖的方法需要 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
    //...
}