在单元测试中模拟查找表是否正确?

时间:2012-08-24 11:29:49

标签: unit-testing mocking

当您为逻辑层编写测试时,您将模拟使用的数据访问层,因为您不希望测试用例彼此依赖。

但查找表怎么样? 假设您有一个逻辑,根据大小表中的大小来计算值:

小1 中2 大3

现在,你在测试中以某种方式嘲笑这张桌子吗?使用字典为例?当表更改时(一个真实的配置表将包含数百个值,有时不会以简单的键值形式)如何保持代码和表不同步?

或您弯曲此规则...并直接从数据库获取值? 但如果明天我改变了数据源怎么办?或者我无法以某种方式访问​​数据库?是不是应该在任何条件下运行的测试用例?

什么是最好的方法?

2 个答案:

答案 0 :(得分:1)

我仍然会模拟查找表,即使对于“快乐”测试场景,您只需返回从数据库返回的实际数据。

但是你可以灵活地测试边缘情况,例如:数据已从数据库中删除,或者没有返回数据。

e.g。

// Happy tests:
Mock.Setup for GetLookupData() => return FetchRealDataHere();
Assert.AreEqual(3, Mock.Object.CountOfSizes()); // Ensure that Small, Medium and Large
... Do Good scenario unit Tests here

// Test Edge cases / destructive tests
Mock.Setup for GetLookupData() => return new Collection() [{ Small, 1}] [{ Medium 2}] -   // But omit large
... Exception case Unit tests here, e.g. Try and Insert a Large product here.

// Test empty collection
Mock.Setup for GetLookupData() => return new Collection() [Empty]
//  Assert that "NoItemsFoundException" was thrown by your logic here

// Handle empty collection
Mock.Setup for GetLookupData() => return new Collection() [Empty]

编辑我已经更新了下面更新评论的伪模拟设置/单元测试代码。

答案 1 :(得分:0)

单元测试的主要思想是,您不需要整个数据来测试您的逻辑。您正在寻找代表不同情况的一些数据,并证明了这种情况的逻辑。就这样。但是,通过单元测试,您不是测试数据,而是测试程序逻辑。