2

如何测试 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 中执行此操作的最佳方法是什么?

4

2 回答 2

2

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

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

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

于 2010-11-30T19:16:12.037 回答
0

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

于 2010-11-30T18:59:35.243 回答