【发布时间】:2020-03-17 08:27:37
【问题描述】:
我正在 TDD 中迈出第一步(我正在学习 Bender 和 McWherter 的“Professional Test-Driven Development with C#”)。
我正在尝试使用 TDD 编写我的第一个应用程序:我假设有一个 DataService 类来管理持久性。我写了两个通过的测试,但我认为我没有明白这一点。
这是我的第一个测试,我假设我可以实例化一个事务,无论它在 DataService 中意味着什么
public void Begin_a_transaction_should_returns_true_when_is_all_ok()
{
Mock<IDataLayer> dataLayer = new Mock<IDataLayer>();
DataService sut = new DataService(dataLayer.Object);
bool expected = true;
dataLayer.Setup(dl => dl.BeginTransaction()).Returns(expected);
bool actual = sut.BeginTransaction();
Assert.AreEqual(expected, actual);
}
现在根据 TDD,我编写了类,这没有问题
public class DataService
{
private IDataLayer _dataLayer;
public DataService(IDataLayer dataLayer)
{
this._dataLayer = dataLayer;
}
public bool BeginTransaction()
{
return _dataLayer.BeginTransaction();
}
}
现在我想写第二个测试:如果事务已经存在,BeginTransaction 应该失败,我要求 IDataLayer 这样做
[Test]
public void Begin_a_transaction_should_throws_exception_if_transaction_already_exists()
{
Mock<IDataLayer> dataLayer = new Mock<IDataLayer>();
DataService sut = new DataService(dataLayer.Object);
dataLayer.Setup(dl => dl.BeginTransaction()).Throws(new Exception("Transaction already exists"));
Assert.Throws<Exception>(() => sut.BeginTransaction());
}
现在重点是:测试通过而无需编写任何代码行,因为我已模拟 BeginTransaction 以引发异常。 可以,因为我将在 IDataLayer 测试的实现中对其进行测试,但如果我全部模拟,DataService 测试是否有用?
【问题讨论】:
-
DataService 不做任何事情,它只是数据层的外观/代理,因此单元测试的效用可能非常低。您的两个测试实际上是相同的:给定一个注入的数据层,调用数据服务方法调用数据层上的一个方法并返回结果。
标签: c# unit-testing tdd