为“私有静态只读"字段创建存根 [英] Creating stub for `private static readonly` field
问题描述
在不正确的实例化问题上到期建议创建HttpClient
的private static readonly
实例.
Due on Improper Instantiation problem it is recommended to create private static readonly
instance of HttpClient
.
由于时间不足,我已将 mocked
客户端注入到测试方法中, c3>作为其参数.
Due on lack of time I have injected mocked
client into test method with client
as their parameter.
问题是如何以简单的方式将mock
注入到SingleHttpClientInstanceController
的private static readonly HttpClient
字段中?
The problem is how can I in simple way inject mock
into private static readonly HttpClient
field of SingleHttpClientInstanceController
?
推荐答案
如何以简单的方式将
mock
注入到SingleHttpClientInstanceController
的private static readonly HttpClient
字段中?
how can I in simple way inject
mock
intoprivate static readonly HttpClient
field ofSingleHttpClientInstanceController
?
答案:没有简单的方法.
Answer: There is no simple way.
建议:
提取访问器背后的资源
public interface IHttpClientAccessor {
HttpClient HttpClient { get; }
}
并将其注入到依赖控制器中.
and inject that into the dependent controller.
public class SingleHttpClientInstanceController : ApiController {
private readonly HttpClient HttpClient;
public SingleHttpClientInstanceController(IHttpClientAccessor httpClientAccessor) {
HttpClient = httpClientAccessor.HttpClient;
}
// This method uses the shared instance of HttpClient for every call to GetProductAsync.
public async Task<Product> GetProductAsync(string id) {
var hostName = HttpContext.Current.Request.Url.Host;
var result = await HttpClient.GetStringAsync(string.Format("http://{0}:8080/api/...", hostName));
return new Product { Name = result };
}
}
访问HttpContext
的操作也应做同样的事情,这是Asp.Net-Core的IHttpContextAccessor
The same should also be done for accessing HttpContext
which is what was recently introduced in Asp.Net-Core's IHttpContextAccessor
IHttpClientAcessor
的实现可以看起来像这样
An implementation of the IHttpClientAcessor
can look something like this
public class HttpClientAccessor : IHttpClientAccessor {
static readonly Lazy<HttpClient> client = new Lazy<HttpClient>(() => new HttpClient());
public HttpClient HttpClient { get { return client.Value; } }
}
所以现在对于测试,您可以注入依赖项的模拟.
So now for tests you can inject mock of the dependency.
如果使用DI容器,请记住也将访问者注册为单例.
If using a DI container remember to register the accessor as a singleton as well.
这篇关于为“私有静态只读"字段创建存根的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!