我仍然是TDD的新手,我也在努力使用一个未考虑测试的遗留应用程序。
我要测试的一个功能(错误)是确定订单是否处于允许用户安排投放的状态。
故事是:给定具有ReadyFrom日期的订单> 10天和<从今天起28天,[用于测试订单的网络服务处于有效交付状态]返回true,系统应列出从ReadyFrom日期开始的7个可用交付日期
所以我确定了一些适合测试这些条件的订单。我想我也应该为Web服务创建一个存根,因此它会根据测试返回true或false。
我写了一个失败的测试,并使用我使用实时数据库的副本修复了错误,问题是下周,我一直使用的订单将不再满足某些条件,这是基于在系统日期。
我是否正确地认为我应该将测试订单放入夹具中并在设置期间动态更改这些订单上的相关日期值,然后在测试中使用它们,并动态地更改我对交付日期的预期系统发回(交付日期也由Web服务返回,也必须进行模拟)
或者这会在应用程序开发时引发问题吗?
由于
答案 0 :(得分:0)
将测试订单放入夹具
是
在设置期间动态更改这些订单上的相关日期值
排序。
不要太复杂 - 听起来。 Fixture应该有一堆具有固定的已知日期的测试订单。你不应该改变太多。
如果 - 由于某种原因 - 日期无法修复,已知日期,那么setUp会做三件事。
使用适当的日期“从头开始”构建订单。
使用适当的日期配置模拟。
为实际使用的测试保存一些“预期结果”提示。
再次。不要让它听起来很复杂。你不是“动态改变我的期望”。你只是在setUp中设定期望值。
动态改变我对系统发回的交付日期的期望 (交付日期也由Web服务返回,也必须进行模拟)
模拟Web服务意味着可以修复日期。模拟和夹具应该能够返回一组固定的日期。
答案 1 :(得分:0)
我使用测试数据构建器模式来创建测试数据并在测试方法本身中进行设置。恕我直言,它使测试代码非常易读。它自己的构建器是这样的(C#+ Rhinomocks):
public class OrderBuilder
{
MockRepository _mockRepository;
IOrder _order;
public OrderBuilder()
{
_mockRepository = new MockRepository();
_order = _mockRepository.Stub<IOrder>();
}
public OrderBuilder WithDate(DateTime date)
{
_order.Date = date;
return this;
}
public IOrder Build()
{
_mockRepository.ReplayAll();
return _order;
}
}
在测试方法中,使用以下语法创建订单:
DateTime someValidDate = new DateTime(1,2,2012);
IOrder order = new OrderBuilder()
.WithDate(someValidDate)
.Build();
不是很漂亮吗? :o)