【发布时间】:2018-12-07 21:41:23
【问题描述】:
我有一个应用程序接收数据,验证它,如果没有发现错误,它会保存到数据库中,如果发现错误,它们会被报告,但没有任何东西进入数据库。
例如我有以下内容:
CREATE TABLE dimension
(
dimension_code VARCHAR(10) NOT NULL PRIMARY KEY
);
CREATE TABLE fact_table
(
fact_id INT IDENTITY(1,1) NOT NULL,
dimension_code VARCHAR(10) NOT NULL,
CONSTRAINT FK_fact_table
FOREIGN KEY (dimension_code)
REFERENCES dimension (dimension_code)
);
INSERT INTO dimension VALUES ('A');
INSERT INTO dimension VALUES ('B');
我的应用允许用户向 fact_table 添加一个值。该代码(尚未编码)应该验证用户尝试添加的值实际上是否在维度表中。如果不是,它将给出一个很好的拼写错误。如果是,则将其插入数据库并返回成功消息。
我从测试驱动开发开始,所以我想到了 2 个单元测试:
- 如果提交的值在代码列表中,则不报错。
- 如果提交的值不在代码列表中,则报错。
我有 Dimension 和 Fact 类。 Dimension 类是一个实体框架类,用于检查数据库值。 Fact 有一个 validate 方法,该方法将进行许多验证,包括即将编写的用于检查维度表中的值的验证。 应用程序中还有一个错误列表(错误是一个类)。
我开始了我的第一个单元测试,如果值不在维度表中,则会创建一个错误。但据我了解,单元测试不应该从数据库中读取。那么我应该怎么做,我是否创建一个虚假的值列表并将其与之进行比较?如果是这样,测试的目的是什么,它将始终通过,因为我正在创建列表和值,因此列表将具有 A、B、C 并且值将是 D,因为我将其硬编码到测试中.或者我应该从数据库中读取? 或者我的单元测试会创建一个 Fact 实例,为其分配一个无效值。调用 validate 就可以了。并且断言错误列表计数现在比以前大 1?但这将从数据库中读取,并且我的“无效”值将来可能会变得有效,测试会失败但我的代码仍然可以。我是不是没有以正确的视角看待事物?
【问题讨论】:
标签: c# unit-testing tdd