ShimNotImplementedException : System.Net.Http.HttpMessageInvoker.Dispose()
ShimNotImplementedException : System.Net.Http.HttpMessageInvoker.Dispose()
我正在使用填充程序(由 Visual Studio 生成)来伪造 HttpClient 实例。下面是 SUT:
public class ExampleForSO
{
private HttpClient _httpClient;
public ExampleForSO(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<List<string>> GetListAsync()
{
using (_httpClient)
{
return await GetListFromHostAsync(_httpClient);
}
}
public async Task<List<string>> GetListFromHostAsync(HttpClient httpClient)
{
var responseJson = await
httpClient.GetAsync("abc")
.Result.Content.ReadAsStringAsync()
;
var fList = JsonConvert.DeserializeObject<List<string>>(responseJson);
return fList;
}
这是单元测试:
[TestMethod]
public void TestMethod1()
{
// Create a fake HttpClient
using (ShimsContext.Create())
{
var fake = new ShimHttpClient()
{
GetAsyncString = (uri) =>
{
var hrm = new HttpResponseMessage(HttpStatusCode.OK);
var list = new List<string>() {"file1", "file2"};
hrm.Content = new StringContent(JsonConvert.SerializeObject(list));
var t = new Task<HttpResponseMessage>(() => hrm);
return Task.Run(() => hrm);
}
};
var _exampleForSO = new ExampleForSO(fake);
var returnValue = _exampleForSO.GetListAsync();
// This line will throw an exception:
var value = returnValue.Result;
Assert.IsNotNull(returnValue);
}
}
当我 运行 执行此操作时,shim 抛出 ShimNotImplemented 异常。堆栈跟踪显示:
$Action1NotImplemented71f6f23c-d227-4cb6-ac76-1f8c8094c413.Invoke(HttpMessageInvoker arg1)
at System.Net.Http.HttpMessageInvoker.Dispose()
如果我注释掉 using (_httpClient)
行,单元测试将 运行 不抛出异常,但这不是一个好的生产解决方案。我的问题是,如何将函数分配给 System.Net.Http.HttpMessageInvoker.Dispose() shim 委托?我无法在任何地方找到对它的引用。我是否必须为 HttpMessageInvoker 创建一个假对象并将其分配给另一个 shim 属性?
你试过这个吗:Visual Studio 2013 Update 4 Changes MSFakes Shim Object Default Behaviour
基本上,调用 Microsoft.QualityTools.Testing.Fakes.Shims.ShimBehaviors.BehaveAsDefaultValue();在实例化垫片之前
我正在使用填充程序(由 Visual Studio 生成)来伪造 HttpClient 实例。下面是 SUT:
public class ExampleForSO
{
private HttpClient _httpClient;
public ExampleForSO(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<List<string>> GetListAsync()
{
using (_httpClient)
{
return await GetListFromHostAsync(_httpClient);
}
}
public async Task<List<string>> GetListFromHostAsync(HttpClient httpClient)
{
var responseJson = await
httpClient.GetAsync("abc")
.Result.Content.ReadAsStringAsync()
;
var fList = JsonConvert.DeserializeObject<List<string>>(responseJson);
return fList;
}
这是单元测试:
[TestMethod]
public void TestMethod1()
{
// Create a fake HttpClient
using (ShimsContext.Create())
{
var fake = new ShimHttpClient()
{
GetAsyncString = (uri) =>
{
var hrm = new HttpResponseMessage(HttpStatusCode.OK);
var list = new List<string>() {"file1", "file2"};
hrm.Content = new StringContent(JsonConvert.SerializeObject(list));
var t = new Task<HttpResponseMessage>(() => hrm);
return Task.Run(() => hrm);
}
};
var _exampleForSO = new ExampleForSO(fake);
var returnValue = _exampleForSO.GetListAsync();
// This line will throw an exception:
var value = returnValue.Result;
Assert.IsNotNull(returnValue);
}
}
当我 运行 执行此操作时,shim 抛出 ShimNotImplemented 异常。堆栈跟踪显示:
$Action1NotImplemented71f6f23c-d227-4cb6-ac76-1f8c8094c413.Invoke(HttpMessageInvoker arg1)
at System.Net.Http.HttpMessageInvoker.Dispose()
如果我注释掉 using (_httpClient)
行,单元测试将 运行 不抛出异常,但这不是一个好的生产解决方案。我的问题是,如何将函数分配给 System.Net.Http.HttpMessageInvoker.Dispose() shim 委托?我无法在任何地方找到对它的引用。我是否必须为 HttpMessageInvoker 创建一个假对象并将其分配给另一个 shim 属性?
你试过这个吗:Visual Studio 2013 Update 4 Changes MSFakes Shim Object Default Behaviour 基本上,调用 Microsoft.QualityTools.Testing.Fakes.Shims.ShimBehaviors.BehaveAsDefaultValue();在实例化垫片之前