【发布时间】:2014-10-07 09:45:45
【问题描述】:
我不确定如何测试将插入某些内容的存储库,应该将它们单独放置还是以某种方式进行测试?如果是,那么如何?我需要在存储库和上下文之间再增加一层吗?
使我的示例更加复杂的是,我正在使用 NoSQL 并且使我的数据士气低落,因此在保存时更改了两个实体,而不是一个。
示例模型
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;
}
}
问题
如何测试这样的存储库?如果它不可测试,那我该如何重构它呢?
【问题讨论】:
-
我使用 dbcontext 工厂类来创建我的上下文并将其传递到我的存储库中。然后我可以使用 Moq 创建一个假的 contextfactory 或只是一个假的上下文,然后我可以测试 repo 是否在上下文中调用了正确的东西......如果这有意义
标签: c# repository tdd repository-pattern denormalization