【问题标题】:Testing state in S#arp Architecture - Best practiceS#arp 架构中的测试状态 - 最佳实践
【发布时间】:2011-05-15 04:20:58
【问题描述】:

如何测试 S#arp 架构项目中的状态?

例如,我有一个自定义 RoleProvider。我想测试方法provider.AddUsersToRoles(string[], string[])。

所以我开始:

// Arrange
const string ficticiousRole = "Management";
var userToExpect = UserInstanceFactory.CreateValidTransientUser();
var roleToExpect = RoleInstanceFactory.CreateValidTransientRole();

userRepository.Expect(r => r.GetByUsername(userToExpect.Username))
              .Return(userToExpect);
roleRepository.Expect(r => r.GetByName(ficticiousRole))
              .Return(roleToExpect);

var userNames = new List<string>();
var roleNames = new List<string>();
userNames.Add(userToExpect.Username);
roleNames.Add(ficticiousRole);

然后我将用户添加到角色。然后我检查用户是否在这个角色中。

// Act
roleProvider.AddUsersToRoles(userNames.ToArray(), roleNames.ToArray());
var isNewUserInRole = roleProvider.IsUserInRole(userToExpect.Username, ficticiousRole);

// Assert
Assert.IsTrue(isNewUserInRole);

问题是我正在使用 Rhino Mocks。我对 Rhino Mocks 的了解有限,但据我了解(根据 Ayende Rahien 的说法),您使用 Rhino Mocks 来测试操作,而不是状态。

所以我想内存中的 SqlLite 数据库会更合适?在 S#arp Arch 中执行此操作的最佳方法是什么?

【问题讨论】:

    标签: tdd rhino-mocks s#arp-architecture sharp-architecture


    【解决方案1】:

    你不能用 Rhino Mocks 做到这一点,因为它只是一个模拟数据库调用等东西的模拟框架。听起来你实际上想要测试数据库的持久性,这基本上是数据库集成测试。在这种情况下,您绝对希望使用 SqlLite 等内存数据库(如果可能!),而不是使用 SQL Server 实例。

    您要做的是在每个测试或测试类开始时拆除已经存在的数据库,重建数据库,用一些种子数据填充数据库,然后测试您的数据库交互。这样,您可以确保在每个测试运行之前您都拥有一个已知的数据库状态。

    我在一个项目中所做的一件事是将我所有的只读测试分组到一个测试类中,这样我只需为该类执行一次数据库重建步骤,并将我所有的删除、更新和插入测试移到其他测试类中在每次测试之前重建数据库的测试类。如果进行了足够多的测试,这可能会非常耗时,并且可能需要降级到 CI 服务器。

    【讨论】:

    • 这就是我的想法,克里斯。谢谢。我只是认为在 S# 中已经为此设置了一些内存数据库。
    • 我刚刚找到了一个 wiki 条目,它描述了如何使用 Sharp 测试数据库操作。基本上,你让你的测试类继承自 RepositoryTestBase。更多信息在这里wiki.sharparchitecture.net/…
    【解决方案2】:

    如果没有看到您的其余代码,就很难回答这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 2020-06-12
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多