我的应用程序使用 Rhino.Commons - NHRepository 和 UnitOfWork。我喜欢事务的 With.Transaction() 语法并且已经使用它一段时间了。

但是我遇到了一个问题 - 如何模拟 UnitOfWork 进行测试?特别是这给我带来了麻烦:

With.Transaction(() => Repositories.TwinfieldSpooler.Update(spool));

我可以使用 Rhino.Mocks 模拟存储库,但是我如何轻松地为这种代码模拟 UnitOfWork?

最佳答案

With.Transaction 使用 UnitOfWork.Current 属性。 UnitOfWork 是一个静态类——你不能用 RhinoMocks 模拟它。

UnitOfWork.Current 是公共(public)静态属性,因此您可以将其换出。不幸的是,setter 是内部的。

我为您看到 3 个选项:

  • 修改 Rhino.Commons 源码,制作 UnitOfWork.Current setter
    公开,并将其设置在您的单元测试中。
  • 使用反射将 UnitOfWork.Current 设置为你的假单位
    工作的。
  • 由于 UnitOfWork.Current 内部使用 Local.Data 来查找当前
    交易,你应该能够
    去:

    Rhino.Commons.Local.Data[UnitOfWork.CurrentUnitOfWorkKey] = myFakeUnitOfWork;

  • 一个好消息是 UnitOfWork.Current 是一个 IUnitOfWork,并且 RhinoMocks 可以很容易地伪造接口(interface)。

    最后我必须说,我对 Rhino.Commons 不是很熟悉,所以 Ayende 可能已经建立了一种伪造 UnitOfWork 的正确方法。如果这对您来说非常重要,您应该在 Rhino 讨论组中提问。

    关于unit-testing - 你如何从 Rhino.Commons 模拟 UnitOfWork?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/724500/

    10-14 18:55