2011-11-17 59 views
1

首先,请原谅我使用术语“单元”,或许我的意思是集成测试。但是,在这种情况下,我将DAO方法的测试视为一个单元,而不是试图模拟下划线数据库。如何组织或分类单元测试DAO搜索方法

我一直在试图测试搜索特定实体中的特定DAO方法 -

public Factor GetMatchingFactor(int aircraftStoresConfigurationId, int stationId, DateTime timeStamp) 
{ 
    // code etc.... 
} 

不,通常情况下,我尝试有几个单元测试,也许几个每个参数,以确保每一个是妥善处理。当这个方法本身处理这个参数时,我对此很满意,而且更糟糕的是调用一个依赖关系,我可以使用mocks/stub来测试。但是,在这种特定的方法中,方法的结果不是纯函数或一个参数,而是参数和测试数据的函数。

因此,我很难定义诸如

public void TestThatAircraftStoresConfigurationIdParameterIsApplied 
public void TestThatStationIdParameterIsApplied 
public void TestThatTimeStampParameterIsApplied 

测试,他们的名字被错误地,每个不只是测试的一件事。

这也意味着我努力遵循每个测试只有一个断言的规则。

因此,我测试了这种方法,使用下面的代码覆盖范围相同,可能更有意义。

[Test] 
    public void TestReturnsCorrectResult() 
    { 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id, new DateTime(2011, 11, 16, 10, 00, 00)).Id, Is.EqualTo(1), "Test 1"); 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id, new DateTime(2011, 11, 16, 11, 00, 00)).Id, Is.EqualTo(1), "Test 2"); 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id, new DateTime(2011, 11, 16, 19, 00, 00)).Id, Is.EqualTo(1), "Test 3"); 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id, new DateTime(2011, 11, 16, 19, 00, 01)).Id, Is.EqualTo(2), "Test 4"); 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id, new DateTime(2011, 11, 16, 19, 00, 02)).Id, Is.EqualTo(2), "Test 5"); 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id, new DateTime(2011, 11, 16, 14, 00, 00)).Id, Is.EqualTo(1), "Test 6"); 
     Assert.That(_sut.GetMatchingFactor(10001, Station.Station10Id, new DateTime(2011, 11, 16, 14, 00, 00)).Id, Is.EqualTo(1), "Test 7"); 
     Assert.That(_sut.GetMatchingFactor(10002, Station.Station11Id, new DateTime(2011, 11, 16, 14, 00, 00)).Id, Is.EqualTo(3), "Test 8"); 
     Assert.That(_sut.GetMatchingFactor(10002, Station.Station12Id, new DateTime(2011, 11, 16, 14, 00, 00)).Id, Is.EqualTo(3), "Test 9"); 
    } 

我不喜欢多重断言,但它似乎是构建这些测试的唯一合乎逻辑的方法。任何人都可以提出更好的选择?

回答

1

这看起来很适合NUnit 2.5中的TestCases。你可以重写你的代码如下:

[TestCase(10001, Station.Station9Id, 2011, 11, 16, 10, 00, 00, 1)] 
[TestCase(10001, Station.Station9Id, 2011, 11, 16, 11, 00, 00, 1)] 
[TestCase(10001, Station.Station9Id, 2011, 11, 16, 19, 00, 00, 1)] 
[TestCase(10001, Station.Station9Id, 2011, 11, 16, 19, 00, 01, 2)] 
[TestCase(10001, Station.Station9Id, 2011, 11, 16, 19, 00, 02, 2)] 
[TestCase(10001, Station.Station9Id, 2011, 11, 16, 14, 00, 00, 1)] 
[TestCase(10001, Station.Station10Id, 2011, 11, 16, 14, 00, 00, 1)] 
[TestCase(10002, Station.Station11Id, 2011, 11, 16, 14, 00, 00, 3)] 
[TestCase(10002, Station.Station12Id, 2011, 11, 16, 14, 00, 00, 3)] 
public void TestReturnsCorrectResult(int configId, int stationId, int yy, int mm, int dd, int h, int m, int s, int expectedResult) 
{ 
    Assert.That(_sut.GetMatchingFactor(configId, stationId, new DateTime(yy,mm,dd,h,m,s)).Id, Is.EqualTo(expectedResult)); 
} 

现在只有一个断言,但有多个事情正在测试。对于您所描述的集成测试来说,这非常棒。

请注意,您只能通过TestCase属性传递常量,因此您无法新建DateTime对象。相反,您必须将年,月,日等作为参数传递给方法,然后自己实例化DateTime。

您也可以考虑使用一些T4脚本从其他一些数据(例如CSV文件)中生成TestCase属性。过去我使用这种方法取得了相当大的成功,它允许最终用户在Excel中创建测试用例,然后将它们传递给您。