2017-07-17 45 views
1

由于Improper Instantiation problem,建议创建private static readonlyHttpClient的实例。为`private static readonly`字段创建存根

由于缺少时间,我已将mocked client注入测试方法,其中参数为client

问题是我该如何以简单的方式将mock注入private static readonly HttpClient字段SingleHttpClientInstanceController

+4

您应该使用IoC容器并将其配置为始终传递单个实例。 – SLaks

+0

需要一些代码 – hellboy

+0

了解IoC容器。确切的细节取决于你如何构建你的代码。 – SLaks

回答

2

我简单的方法怎么能注入mockSingleHttpClientInstanceControllerprivate 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容器,请记住将访问器注册为单例。