【问题标题】:How to test if a fluent service method is called如何测试是否调用了流畅的服务方法
【发布时间】:2010-09-08 15:33:32
【问题描述】:

我有一个安全规则,新注册的用户对其自己的用户实体拥有完全权限。我正在使用 Rhino.Security 并且代码工作正常,但我想创建一个单元测试以确保进行适当的调用来设置权限。这是代码的简化版本:

public User Register(UserRegisterTask userRegistrationTask) {
   User user = User.Create(userRegistrationTask);
   this.userRepository.Save(user);

   // Give this user permission to do operations on itself
   this.permissionsBuilderService.Allow("Domain/User")
       .For(user)
       .On(user)
       .DefaultLevel()
       .Save();

   return user;
}

我已经模拟了 userRepository 和 permissionBuilderService 但permissionBuilderService 的流畅接口需要从链中的每个方法调用返回不同的对象(即 .Allow(...).For(...).On (...) ETC)。但我找不到模拟链中每个对象的方法。

有没有办法测试permissionBuilderService 的Allow 方法是否被调用但忽略了链的其余部分?

谢谢 丹

【问题讨论】:

  • 真正的permissionsBuilderService有副作用吗? (即是否可以在测试中使用真实的?)
  • 真正的 permissionsBuilderService 期望附加一个真正的数据库。这是可能的,但需要为每种测试设置数据库并拆除它。我希望有一些要求不高的东西。

标签: unit-testing rhino-mocks fluent rhino-security


【解决方案1】:

我也遇到了这个问题,并最终将 Rhino 安全功能包装在服务层中,原因有两个:

  1. 它正在对真正的 PITA 进行单元测试,在花了几个小时将我的头撞在砖墙上之后,这种方法让我可以更轻松地模拟这一层。
  2. 我开始觉得 Rhino Security 与我的控制器耦合非常紧密(我的应用程序使用 MVC)。将调用封装在另一层可以让我更松散地耦合到特定的安全实现,并且可以让我在未来轻松地将其换成另一个(如果我愿意的话)。

显然,这只是一种方法。但它让我的生活更轻松......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多