gpt4 book ai didi

c# - 如何正确地对存储库进行单元测试 CRUD 操作?

转载 作者:太空狗 更新时间:2023-10-29 17:55:37 25 4
gpt4 key购买 nike

意识到这听起来像是一个广泛的问题 - 所以让我澄清一下。我有一个通过接口(interface)公开的存储库,有两个具体实现 - MockRepositoryEntityFrameworkRepository

现在,我有一个单元测试项目,通过在 [TestInitialize] 中轻拂一行,所有测试都可以针对任一存储库运行。

我的问题基本上是“我应该如何编写测试”。

这是我所拥有的:

创建

// Arrange.
var foo = new Foo { .. };

// Act
Repository.Add(foo);
UnitOfWork.Commit();

// Assert
Assert.IsTrue(foo.Id > 0);

R 检索

// Arrange.
var fooToGet = 1;

// Act
var foo = Repository.FindSingle(fooToGet);

// Assert
Assert.IsNotNull(foo);
Assert.AreEqual(foo.Id, fooToGet);

更新

// Arrange.
var fooToGet = 1;
var nameToChangeFooTo = "FooBar";

// Act
var foo = Repository.FindSingle(fooToGet);
foo.Name = nameToChangeFooTo;
UnitOfWork.Commit();
var fooRetrievedAgain = Repository.FindSingle(fooToGet);

// Assert
Assert.IsNotNull(foo);
Assert.AreEqual(fooRetrievedAgain.Id, fooToGet);
Assert.AreEqual(fooRetrievedAgain.Name, nameToChangeFooTo);

D 元素

// Arrange.
var fooToGet = 1;

// Act
var foo = Repository.FindSingle(fooToGet);
Repository.Remove(foo);
UnitOfWork.Commit();
var fooRetrievedAgain = Repository.FindSingle(fooToGet);

// Assert
Assert.IsNull(fooRetrievedAgain);

对于 Mock 和 EF 存储库,它工作ok,但我的主要问题是 C(创建)。我不确定如何在我的存储库上测试添加操作。我在做什么感觉不对

它通过了 EF 存储库,但为了让它通过我的模拟存储库,我不得不使用反射来更新内存集合中的 ID(讨厌)。

那么 - 您能否就在存储库模式上测试 CRUD 操作的正确方法分享一些建议?

这是一个 ASP.NET MVC 应用程序、.NET 4、C#、 Entity Framework 4 和工作单元/存储库模式。

谢谢。

编辑

澄清一下,这些不是我拥有的全部单元测试。我有针对我的服务层的单元测试,以及业务规则测试。

如果我上面的 Repository 测试失败,后者将(并且应该)失败。这就是重点,对我的存储库的非常基本的操作 进行单元测试。我错了吗?

最佳答案

一种选择是使用像 SqlLite 这样的内存数据库来测试映射、查询和存储库的行为。这由 Ayende 讨论 here ,尽管他的示例使用 NHibernate。

似乎可以解决您对设置域对象 ID 的直接关注的另一个选项是使用测试假货。这由 RhysC 讨论 here .

关于c# - 如何正确地对存储库进行单元测试 CRUD 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3993739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com