C# 为使用RestClient的实用程序编写单元测试
我们已经决定创建一个可以跨多个项目重用的HTTP记录器,我们创建了一个如下所示的实用程序C# 为使用RestClient的实用程序编写单元测试,c#,unit-testing,restsharp,C#,Unit Testing,Restsharp,我们已经决定创建一个可以跨多个项目重用的HTTP记录器,我们创建了一个如下所示的实用程序 // pseudo-code public class HttpLog{ private readonly string uri; private readonly RestClient client; public HttpLog(string uri){ this.uri = uri; // notice the initia
// pseudo-code
public class HttpLog{
private readonly string uri;
private readonly RestClient client;
public HttpLog(string uri){
this.uri = uri;
// notice the initialization of rest client
this.client = new RestClient();
}
void write(object data){
this.client.uri = this.uri + endpoint;
this.client.postAsync(data);
}
}
使用者应该提供URI,并且我们已经公开了记录数据的公共写入方法,但是,我们无法对我们的HttpLog
类进行单元测试,因为它初始化了rest客户端。我们没有使用依赖注入,因为我们正在创建实用程序
任何关于如何重构或单元测试的帮助都将不胜感激。write()
method
我们可以想出两种方法
- 构造函数重载(这不是进行单元测试的有效方法)
- 将客户机属性设置为公共{get;set},这也违反了OOP原则
如果我的假设是错误的,请纠正我首先:你在测试什么?您的方法,还是REST服务本身 既然您说“我们无法对我们的HttpLog类进行单元测试”,那么我推断您正在尝试测试您的类 因此,您应该在不使用REST服务(这是一个外部依赖项)的情况下测试它。REST客户机应该作为依赖项注入,这样就可以轻松地模拟它 我们没有使用依赖注入,因为我们正在创建实用程序 这不是跳过依赖项注入的有效参数 注意:我从您的陈述中推断,您知道如何实现依赖项注入,您只是选择了不这样做。我将省略依赖注入的一个实际例子,因此这个答案可以集中在核心问题上:您决定不使用依赖注入
相比之下,使用构造函数参数可以实现相同的功能(公开选择客户机),而不会影响封装(无法在对象的生命周期内更改客户机)
因此,答案是首先使用依赖注入:你在测试什么?您的方法,还是REST服务本身 既然您说“我们无法对我们的HttpLog类进行单元测试”,那么我推断您正在尝试测试您的类 因此,您应该在不使用REST服务(这是一个外部依赖项)的情况下测试它。REST客户机应该作为依赖项注入,这样就可以轻松地模拟它 我们没有使用依赖注入,因为我们正在创建实用程序 这不是跳过依赖项注入的有效参数 注意:我从您的陈述中推断,您知道如何实现依赖项注入,您只是选择了不这样做。我将省略依赖注入的一个实际例子,因此这个答案可以集中在核心问题上:您决定不使用依赖注入
相比之下,使用构造函数参数可以实现相同的功能(公开选择客户机),而不会影响封装(无法在对象的生命周期内更改客户机) 因此,答案是使用依赖注入 我们没有使用依赖注入,因为我们正在创建utilit
public class HttpLog{
private readonly string uri;
private readonly RestClient client;
public HttpLog(string uri) : this(uri, new RestClient()){
}
public HttpLog(string uri, RestClient restClient){
this.uri = uri;
// notice the initialization of rest client
this.client = restClient;
}
void write(object data){
this.client.uri = this.uri + endpoint;
this.client.postAsync(data);
}
}