【发布时间】:2023-03-16 23:40:01
【问题描述】:
假设你有一个像这样的抽象基类:
public abstract class WebApiServiceBase
{
public WebApiServiceBase(
HttpClient httpClient)
{
HttpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
}
protected HttpClient HttpClient { get; }
// For brevity, omitted some instance methods that can be used by derived classes
}
该类知道它需要构造函数中的 HttpClient,因此如果它为 null,它会引发错误。是否应该对这种抛出错误的功能进行单元测试?
如果是这样,最好的方法是什么,因为您不能像这样在单元测试中直接实例化抽象类:
[TestClass()]
public class WebApiServiceBaseTests
{
[TestMethod()]
public void WebApiServiceBase_NullHttpClient_ThrowsArgumentNull()
{
//Arrange
Action action = () => {
var controller = new WebApiServiceBase(null); // Won't compile, of course, because you can't directly instantiate an abstract class
};
//Act
//Assert
Assert.ThrowsException<ArgumentNullException>(action);
}
}
我知道我可以做很多事情:
- 仅测试派生类中的错误抛出功能。
- 在测试代码中创建一个新的派生类,仅用于测试。
- 一开始就不要把这样的类抽象化。
- 可能还有其他一些我没有想到的想法。
但是我应该做什么呢? 最佳实践是什么?
【问题讨论】:
-
这里有一个正确答案的想法有点奇怪。
-
嗯,编写单元测试的全部目的是获得代码覆盖率并建立一个系统,您可以轻松地验证您所做的更改是否不会破坏系统中的任何内容。由于您的类是抽象的并且永远不会被实例化,我认为尝试测试它没有意义。您确实在派生类中测试了这种功能,这隐含地测试了您的基类
-
但是 Jochem,你不能也争辩说,因为没有派生类抛出 ArgumentNullException,你可能不会考虑在派生类中对它进行单元测试,所以你可能忘记测试了吗?
标签: c# unit-testing mstest