Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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# 模拟HttpClient和发送/获取cookie的正确方法_C#_Unit Testing_Cookies_Moq_Dotnet Httpclient - Fatal编程技术网

C# 模拟HttpClient和发送/获取cookie的正确方法

C# 模拟HttpClient和发送/获取cookie的正确方法,c#,unit-testing,cookies,moq,dotnet-httpclient,C#,Unit Testing,Cookies,Moq,Dotnet Httpclient,我正在使用模拟为HttpClient类创建的包装器: 因此,在我的应用程序中,一切正常,我得到服务器cookies设置的cookies。计数不是0 对于我的测试,我有一个Mock,我已经设置了它的PostAsync方法来返回一个新的HttpResponseMessage。我还调用HttpResponseMessage.Headers.AddCookies方法向该响应添加2个Cookie 但当我用这样的方式调用我的模拟对象时: /* I setup url and content */ var m

我正在使用模拟为HttpClient类创建的包装器:

因此,在我的应用程序中,一切正常,我得到服务器cookies设置的cookies。计数不是0

对于我的测试,我有一个Mock,我已经设置了它的PostAsync方法来返回一个新的HttpResponseMessage。我还调用HttpResponseMessage.Headers.AddCookies方法向该响应添加2个Cookie

但当我用这样的方式调用我的模拟对象时:

/* I setup url and content */
var mock = new Mock<IHttpClientHelper>();
mock.Setup(/* setup PostAsync to return the response I create */)...
var cookies = new CookieContainer();
var response = await mock.PostAsync(url, content, cookies);
然后,饼干。计数总是0

所以,我想知道与调用实际服务器有什么不同?我需要额外的标题吗?如何在此处设置Cookie?

作为参数传递给PostAsync方法的CookieContainer。PostAsync将cookies添加到CookiesContainer是此方法的一个副作用,这是特定IHttpClientHelper实现的一个细节。new Mock创建了另一个不添加cookie的实现

因此,如果您希望mock将cookie添加到容器中,则需要额外的设置

mock.Setup(_ => _.PostAsync(It.IsAny<Uri>(), It.IsAny<HttpContent>(), It.IsAny<CookieContainer>()))
    .Callback<Uri, HttpContent, CookieContainer>((u, c, cookieContainer) => 
    {
        // Add required cookies here
        cookieContainer.Add(...);
    });

回调是一种模拟设置副作用的方法。

这不是一种可以用来重现问题的方法。只是一个问题,您能解释一下回调在这里工作的原因吗?我对Moq还不熟悉,但是看了一些教程,我认为回调函数是在第二次调用该方法时调用的。是这样吗?
/* I setup url and content */
var mock = new Mock<IHttpClientHelper>();
mock.Setup(/* setup PostAsync to return the response I create */)...
var cookies = new CookieContainer();
var response = await mock.PostAsync(url, content, cookies);
mock.Setup(_ => _.PostAsync(It.IsAny<Uri>(), It.IsAny<HttpContent>(), It.IsAny<CookieContainer>()))
    .Callback<Uri, HttpContent, CookieContainer>((u, c, cookieContainer) => 
    {
        // Add required cookies here
        cookieContainer.Add(...);
    });