我简单的方法怎么能注入mock
成SingleHttpClientInstanceController
private static readonly HttpClient
领域?
答:没有简单的方法。
建议:
摘要的访问
public interface IHttpClientAccessor {
HttpClient HttpClient { get; }
}
,并注入到这依赖控制器背后的资源。
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核心的IHttpContextAccessor
的IHttpClientAcessor
的实现是最近推出的可以是这个样子
public class HttpClientAccessor : IHttpClientAccessor {
static readonly Lazy<HttpClient> client = new Lazy<HttpClient>(() => new HttpClient());
public HttpClient HttpClient { get { return client.Value; } }
}
完成所以现在对于测试你可以注入依赖的模拟。
如果使用DI容器,请记住将访问器注册为单例。
您应该使用IoC容器并将其配置为始终传递单个实例。 – SLaks
需要一些代码 – hellboy
了解IoC容器。确切的细节取决于你如何构建你的代码。 – SLaks