gpt4 book ai didi

.net - 具有级联 CRUD 操作的单元测试和假存储库实现

转载 作者:行者123 更新时间:2023-12-04 06:52:47 31 4
gpt4 key购买 nike

我在编写使用假存储库的集成测试时遇到问题,

例如:假设我有一个教室实体,它聚合学生......

var classroom = new Classroom();
classroom.Students.Add(new Student("Adam"));

_fakeRepository.Save(classroom);

_fakeRepostiory.GetAll<Student>().Where((student) => student.Name == "Adam"));
// This query will return null...

当使用我对存储库的真实实现(基于 NHibernate)时,上面的代码可以工作(因为保存操作会级联到上一行添加的学生),

你知道任何支持这种行为的虚假存储库实现吗?
关于如何自己实现的想法?

或者您有任何其他建议可以帮助我避免这个问题吗?

提前致谢,
埃里克。

最佳答案

如果您正在编写问题主体所表明的“集成测试”,那么您将不会使用虚假的实现——使用真实的实现。
如果您正在编写单元测试,正如您的问题的标题所示,您不会关心操作是否级联,因为这不是 Classroom 类的关注点——您只关心 Save()在该类作为依赖项提供的任何存储库上被调用。
如果您正在编写一个围绕 NHibernate 执行级联操作的能力的单元测试,那么这些测试已经编写完成,并且无法证明 Classroom 类。
编辑以回应评论:
单元测试用于测试功能的单个“单元”,独立于任何其他类或服务——在这种情况下,您对那些其他类使用假货,以确保它们完全且仅执行该类所需的操作。集成测试用于测试多个类和/或子系统(如数据库访问、ORM 等)之间的交互。在这种情况下,您似乎想测试级联保存/更新,但这是 NHibernate 的责任,不是吗?
但是假设你有一个类可以保存 classroom使用 IRepository<Classroom> ,并将该操作包装在 try…catch 中 block ,并且您想在 IRepository<Classroom> 时进行单元测试抛出 RepositoryWriteFailureException ,错误计数属性,ErrorCount增加。在这里,您确实需要存储库的假实现,这就是像 RhinoMocks、nMock、Moq 或 TypeMock Isolator 这样的模拟框架发挥作用的地方——这些可以使用接口(interface)、抽象类或已声明公共(public)方法和属性的类 virtual.我可能会编写这样的测试主体(将其视为伪代码):

// set up the context (arrange)

// create the fake repository
var fake_repository = MockRepository.GenerateStub<IRepository<Classroom>>();

// create the classroom, injecting the fake repository
dim classroom as new Classroom(fake_repository);

// now tell the fake how to behave
fake_repository.Stub(repo => repo.Save(classroom))
.WhenCalled(throw new RepositoryWriteFailureException());

// do what you're testing (act)
classroom.Save();


// assert the expected behaviour (assert)

// verify that the fake_repository was told to Save(classroom)
Assert.IsTrue(fake_repository.WasToldTo(repo => repo.Save(classroom)).Times(1);

// verify that the error count property was incremented
Assert.IsTrue(classroom.ErrorCount == 1);
请注意我们如何测试 Classroom类或您正在测试的任何内容,甚至无需实现存储库即可运行。

关于.net - 具有级联 CRUD 操作的单元测试和假存储库实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2877999/

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