意识到这可能听起来像一个广泛的问题 - 所以让我澄清一下。我有一个通过接口公开的存储库,有两个具体的实现 - MockRepository 和 EntityFrameworkRepository 。
现在,我有一个Unit-Test项目,可以通过点击[TestInitialize]
中的一行来对 存储库运行所有测试。
我的问题基本上是“我该如何编写测试”。
这就是我所拥有的:
C reate
// Arrange.
var foo = new Foo { .. };
// Act
Repository.Add(foo);
UnitOfWork.Commit();
// Assert
Assert.IsTrue(foo.Id > 0);
R etrieve
// Arrange.
var fooToGet = 1;
// Act
var foo = Repository.FindSingle(fooToGet);
// Assert
Assert.IsNotNull(foo);
Assert.AreEqual(foo.Id, fooToGet);
U pdate
// 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 elete
// 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#,实体框架4和工作单元/存储库模式。
感谢。
修改
只是为了澄清一下,这些并非全部我所拥有的单元测试。我有我的服务层的单元测试,以及业务规则测试。
如果上面的Repository测试失败,后者都会(并且应该)失败。这就是我的存储库的非常基本的操作的单元测试。我错了吗?
答案 0 :(得分:3)
一种选择是使用内存数据库(如SqlLite)来测试映射,查询和存储库的行为。 Ayende here讨论了这个问题,尽管他的例子使用了NHibernate。
另一个似乎解决您设置域对象ID的问题的选择是使用测试假货。这由RhysC here讨论。
答案 1 :(得分:2)
IMO,您的创建测试应该:
我有很多像你这样的单元测试,主要区别在于我使用深度比较方法来比较对象实例。例如,我的U测试看起来像这样: