C# 如何测试存储库插入?

C# 如何测试存储库插入?,c#,repository,tdd,repository-pattern,denormalization,C#,Repository,Tdd,Repository Pattern,Denormalization,我不确定如何测试将插入内容的存储库,应该让它们单独测试还是以某种方式进行测试?如果是的话,怎么办?我是否需要存储库和上下文之间的另一层 让我的例子更加复杂的是,我使用NoSQL,降低了数据的士气,因此在save上更改了两个实体,而不是一个 示例模型 问题: 如何测试这样的存储库?如果它是不可测试的,那么我如何重构它,使其成为可测试的?我相信您需要的是集成测试,而不是单元测试。通过集成测试,您可以测试您的UserRepository是否与实际的持久化层正确合作(我还建议在UserRepositor

我不确定如何测试将插入内容的存储库,应该让它们单独测试还是以某种方式进行测试?如果是的话,怎么办?我是否需要存储库和上下文之间的另一层

让我的例子更加复杂的是,我使用NoSQL,降低了数据的士气,因此在save上更改了两个实体,而不是一个

示例模型 问题:
如何测试这样的存储库?如果它是不可测试的,那么我如何重构它,使其成为可测试的?

我相信您需要的是集成测试,而不是单元测试。通过集成测试,您可以测试您的
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 --- */
}