C# 使用ForPartsOf并模拟异步方法时,NSSubstitute返回NullReferenceException

C# 使用ForPartsOf并模拟异步方法时,NSSubstitute返回NullReferenceException,c#,unit-testing,mocking,xunit,nsubstitute,C#,Unit Testing,Mocking,Xunit,Nsubstitute,我有两种方法: 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();

我有两种方法:

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

}
我的猜测是,在某种程度上,它正试图解析
MyModel
;但是,当在同步方法上或在没有复杂参数的方法上执行时,相同的测试也可以工作

有人能告诉我为什么会出现这种错误吗

  • 不要等待设置

  • 重写的方法需要返回一个
    任务
    ,以允许在测试中调用async时完成

  • 这意味着需要重写设置

    [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
        //...
    }
    
    [事实]
    公共异步任务Test6(){
    //安排
    var myClass=Substitute.ForPartsOf();
    MethodOne(Arg.Any()).Returns(Task.FromResult((object)null));
    //表演
    等待myClass.MethodTwo();
    //断言
    //...
    }
    
    1)不要等待安装2)重写的方法需要返回一个任务,以允许async流向Completion,从而阻止问题的发生-但没有回答我的问题,即为什么会发生这种情况,因为在等待安装时,它实际上是在试图调用该方法,该方法需要编译表达式,因此需要获取传入的参数将为null,因为
    Arg.*
    没有给出实际的对象。是-当然是。奇怪的是,你怎么能看东西看了很久却看不到明显的东西。谢谢你的帮助
    [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
        //...
    }