Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NSubstitute模拟IFlurl库方法会引发null引用异常_C#_Mocking_Xunit_Nsubstitute_Flurl - Fatal编程技术网

C# 使用NSubstitute模拟IFlurl库方法会引发null引用异常

C# 使用NSubstitute模拟IFlurl库方法会引发null引用异常,c#,mocking,xunit,nsubstitute,flurl,C#,Mocking,Xunit,Nsubstitute,Flurl,我正在使用并尝试对以下代码进行单元测试: public class MyRestClient { public async Task<T> Request<T>(IFlurlRequest flurlRequest) { try { return await flurlRequest .WithOAuthBearerToken("my-hardcoded-t

我正在使用并尝试对以下代码进行单元测试:

public class MyRestClient
{
    public async Task<T> Request<T>(IFlurlRequest flurlRequest)
    {
        try  
        {
            return await flurlRequest
                    .WithOAuthBearerToken("my-hardcoded-token")
                    .GetAsync()
                    .ReceiveJson<T>();  
        }
        catch(HttpFlurlException)
        {
            throw new MyCustomException();
        }
    }
}
运行时返回NullReferenceException的代码:

Exception has occurred: CLR/System.NullReferenceException
An exception of type 'System.NullReferenceException' occurred in 
Flurl.Http.dll but was not handled in user code: 'Object reference not 
set to an instance of an object.'
at Flurl.Http.HeaderExtensions.WithHeader[T](T clientOrRequest, String name, Object value)
所以我看到它与标题有关。。。因此,我还试图通过添加以下内容来嘲弄这一点:

var moq = Substitute.For<IFlurlRequest>();
moq.Headers.Returns(new Dictionary<string, object> { {"dummy", new {} };
var moq=Substitute.For();
返回(新字典{“dummy”,新{};
但是我经常遇到同样的异常。我做错了什么?

是一个扩展方法,这意味着它不能被NSubstitute直接模拟。当调用扩展方法的
When..Do
返回
时,它将运行扩展方法的真实代码。(我建议添加到测试项目中以检测这些情况。)

在编写本文时,通过跟踪扩展方法实现,应该可以模拟
Headers
属性来抛出所需的异常,但我认为这会拖累太多库的内部知识,并会导致与特定实现紧密耦合的脆弱测试(这正是我们通过嘲笑来避免的!)

我会非常谨慎地以这种方式模拟第三方库,正如我在以下内容中概述的:

另一种选择是在不同的层面上进行测试。我认为测试当前代码的摩擦在于,我们试图替换[第三方库]的细节,而不是我们为划分应用程序的逻辑细节而创建的接口。搜索“不要模拟你不拥有的类型”更多关于为什么这会成为一个问题的信息(我以前写过)

如果可能的话,我建议尝试改用。这将使您能够伪造所需的行为,而不需要有关Flurl内部实现的具体细节。

是一种扩展方法,这意味着它不能被NSubstitute直接模拟。当您调用
When..Do
时,将返回扩展方法上的
od它将运行扩展方法的实际代码。(我建议添加到您的测试项目中以检测这些情况。)

在编写本文时,通过跟踪扩展方法实现,应该可以模拟
Headers
属性来抛出所需的异常,但我认为这会拖累太多库的内部知识,并会导致与特定实现紧密耦合的脆弱测试(这正是我们通过嘲笑来避免的!)

我会非常谨慎地以这种方式模拟第三方库,正如我在以下内容中概述的:

另一种选择是在不同的层面上进行测试。我认为测试当前代码的摩擦在于,我们试图替换[第三方库]的细节,而不是我们为划分应用程序的逻辑细节而创建的接口。搜索“不要模拟你不拥有的类型”更多关于为什么这会成为一个问题的信息(我以前写过)


如果可能的话,我建议尝试改用。这应该可以让你在不需要关于Flurl内部实现的具体细节的情况下假装出你需要的行为。

这太棒了,我确实想知道——如果我在模仿这一点上遇到了这么多困难,这本身就是一个警告信号吗?确实如此。扩展方法可以让你完全se,我一定会安装NSub分析仪!谢谢,你帮了我很大的忙!这太棒了,我想知道-如果我在模仿这一点上遇到了这么多麻烦,这本身就是一个警告标志吗?确实是。扩展方法完全有意义,我一定会安装NSub分析仪!谢谢,你帮了我很大的忙!
var moq = Substitute.For<IFlurlRequest>();
moq.Headers.Returns(new Dictionary<string, object> { {"dummy", new {} };