C# 如何对集合的保存进行单元测试

C# 如何对集合的保存进行单元测试,c#,arrays,unit-testing,collections,C#,Arrays,Unit Testing,Collections,我正在尝试为一个将多条记录保存到数据库中的方法编写一个单元测试。方法被传递一个集合参数。该方法在集合中循环。设置与对象关联的用户ID,并在数据库中更新记录。这是为集合中的每个对象执行的。除了将单元测试写入数据库之外,还知道如何创建单元测试吗 谢谢,如评论中所述,您可以选择通过某些接口抽象数据库操作。如果您使用ORM,您可以实现通用存储库,如果您使用普通ADO.NET,您可以实现事务脚本之类的东西 另一种选择是使用SQLite内存数据库。不清楚您使用的是什么db接口,但是.NET中的大多数数据库访

我正在尝试为一个将多条记录保存到数据库中的方法编写一个单元测试。方法被传递一个集合参数。该方法在集合中循环。设置与对象关联的用户ID,并在数据库中更新记录。这是为集合中的每个对象执行的。除了将单元测试写入数据库之外,还知道如何创建单元测试吗


谢谢,

如评论中所述,您可以选择通过某些接口抽象数据库操作。如果您使用ORM,您可以实现通用存储库,如果您使用普通ADO.NET,您可以实现事务脚本之类的东西


另一种选择是使用SQLite内存数据库。不清楚您使用的是什么db接口,但是.NET中的大多数数据库访问方法(包括Entity Framework)都支持SQLite。这并不完全是一个单元测试,但它确实起到了作用。

正如评论中所建议的,您有两个选择

  • 为实际写入数据库创建一个抽象,并验证与该抽象的交互是否与您的方法预期的一样。这将为您提供快速的单元测试,但您仍然需要编写集成测试,以实现将数据实际放入数据库的抽象。要验证交互,您可以使用模拟库,也可以创建接口的实现,以便使用进行测试
  • 创建写入数据库的集成测试,并验证数据是否按预期插入。这些测试会比较慢,但会让您确信数据将实际放置在数据库中

我倾向于第二种选择,因为这将测试数据是否能够正确持久化,这是您最终必须要做的事情,但不是每个人都喜欢这样做

您是否对数据库CRUD操作(例如存储库模式)有一个抽象?最后,您希望验证每个记录是否已更新,这可以像伪造存储库和验证所有记录是否提交到“更新”方法一样简单。如果您没有这样一个可替换的抽象,那么集成测试当然可以用来写入测试数据库并验证结果,然后自己清理。抽象某个接口后面的数据库逻辑。模拟接口并查看是否进行了所需的调用。如果这对你发布代码没有帮助,你肯定需要看看
存储库模式
。它使持久性更容易测试。根据您的喜好,我发现两者都需要,但原因不同。这里测试的方法必须循环多个记录,更新字段,然后将记录持久化到数据库。这是可以独立于实际写入数据库进行测试的逻辑,所以这就是单元测试。因此,编写可以是一个独立的操作,它关注单个记录(例如
repository.Update(item)
),具体的更新方法当然应该有一个集成测试来确认记录是否按预期保存,但该测试与无关逻辑无关。是的,我欣赏这种方法。尽管最近我倾向于使用specflow进行端到端测试,并使用一些单元测试来清理边缘。它们速度较慢,但看起来不那么脆弱,我最终不得不更改所有的测试,因为我决定重新构造代码。YMMV。我保留将来改变主意的权利:-)。谢谢你提供的所有信息。我应该提供一些额外的信息。我使用的是存储库模式和JustMock。在尝试了几件事情之后,我决定限制单元测试,以确保集合中相同数量的项发生更新,并且更新的属性设置正确。这基本上就是安东尼·佩格拉姆的建议。我使用Mock.Arrange…Arg.Matches(检查属性是否正确更新)…发生(3),其中3表示集合中的对象数。