C# 如何测试存储库插入?
我不确定如何测试将插入内容的存储库,应该让它们单独测试还是以某种方式进行测试?如果是的话,怎么办?我是否需要存储库和上下文之间的另一层 让我的例子更加复杂的是,我使用NoSQL,降低了数据的士气,因此在save上更改了两个实体,而不是一个 示例模型 问题:C# 如何测试存储库插入?,c#,repository,tdd,repository-pattern,denormalization,C#,Repository,Tdd,Repository Pattern,Denormalization,我不确定如何测试将插入内容的存储库,应该让它们单独测试还是以某种方式进行测试?如果是的话,怎么办?我是否需要存储库和上下文之间的另一层 让我的例子更加复杂的是,我使用NoSQL,降低了数据的士气,因此在save上更改了两个实体,而不是一个 示例模型 问题: 如何测试这样的存储库?如果它是不可测试的,那么我如何重构它,使其成为可测试的?我相信您需要的是集成测试,而不是单元测试。通过集成测试,您可以测试您的UserRepository是否与实际的持久化层正确合作(我还建议在UserRepositor
如何测试这样的存储库?如果它是不可测试的,那么我如何重构它,使其成为可测试的?我相信您需要的是集成测试,而不是单元测试。通过集成测试,您可以测试您的
UserRepository
是否与实际的持久化层正确合作(我还建议在UserRepository
前面加前缀,以使这种依赖关系更清晰,例如mongouserepository
或您正在使用的底层NoSQL DB)
这些集成测试应该如下所示(我不知道C#所以对错误表示歉意)
最后,您可能需要将单元测试与集成测试分开,因为后者的运行速度较慢。理想情况下,建筑系统的默认任务应该只运行单元测试。然后,特定任务可以运行集成测试。显然,您的持续集成系统同时运行两个我使用一个dbcontext工厂类来创建我的上下文并将其传递到我的repo中。然后我可以使用Moq创建一个假的contextfactory或者只是一个假的context,然后我可以测试repo是否在上下文中调用了正确的东西。。。如果这有道理的话
public class User
{
public ObjectId Id { get; set; }
public string Email { get; set; }
// ... more properties
public List<UserUsergroupDto> Usergroups { get; set; } // Usergroup Id and Name
}
public class Usergroup
{
public ObjectId Id { get; set; }
public string Name { get; set; }
// ... more properties
public List<UsergroupUserDto> Users { get; set; } // User Id and Email
}
public class UserRepository : IUserRepository
{
// Inject db context, etc..
public User ChangeEmailById(ObjectId id, string email)
{
// Save user email
var user = _db.Users.AsQueryable().First(x => x.Id == id);
user.Email = email;
_db.User.Save(user);
// Save user email on every group he is (because denormalization)
user.Usergroups.ForEach(x =>
{
var usergroup = _db.Usergroups.First(z => z.Id == x.Id);
var userDto = usergroup.Users.First(z => z.Id == user.Id);
userDto.Email = email;
_db.Usergroups.Save(usergroup);
};
return user;
}
}
public void testChangeUserEmailById() {
/* setup */
user = nextUser(); /* using the unique generator pattern */
expectedEmail = nextEmailAddress();
dbSpy = connectToTheActualNoSqlDb();
dbSpy.insert(user);
/* exercise */
noSqlUserRepository.ChangeEmailById(user.id, expectedEmail);
/* verify */
assertEquals(expectedEmail, dbSpy.getUserEmail(user.id);
}
public void testChangeUserGroupsEmailById() {
/* setup */
user = nextUser(); /* using the unique generator pattern */
expectedEmail = nextEmailAddress();
dbSpy = connectToTheActualNoSqlDb();
dbSpy.insert(user);
/* exercise */
noSqlUserRepository.ChangeEmailById(user.id, expectedEmail);
/* verify */
/* --- I've not really understood what is to be changed here --- */
}