【问题标题】:Unit testing void methods for repository存储库的单元测试无效方法
【发布时间】:2013-08-22 13:52:15
【问题描述】:

我想测试我的 void 存储库。我的服务类是这样的。

public class AccountService
{
    private readonly IAccountRepository accountRepository;

    public AccountService(IAccountRepository accountRepository)
    {
        this.accountRepository = accountRepository;
    }

    public User GetById(string userId)
    {
        User user = accountRepository.GetById(userId);

        if (user == null)
            throw new UserNotFoundException();

        return user;
    }

    public void Add(User user)
    {
        accountRepository.Add(user);
    }
}

在我的测试类中,我使用 FakeItEasy 工具创建了一个假存储库。

[TestFixture]
public class AccountServiceTests
{
    private IAccountRepository repository;
    private AccountService service;

    private  string ValidUserId = "aaa";
    private  string InvalidUserId = "xxx";

    private List<User> getUsers()
    {
        return new List<User> {new User {UserId = ValidUserId}};
    }

    private readonly User newUser= new User();

    [SetUp]
    public void Setup()
    {
        repository = A.Fake<IAccountRepository>();
        service = new AccountService(repository);

        A.CallTo(() => repository.GetById(ValidUserId))
            .Returns(new User{UserId = ValidUserId});

        A.CallTo(() => repository.GetById(InvalidUserId))
            .Returns(null);

        A.CallTo(() => repository.Add(A<User>.Ignored))
            .???
    }

    [Test]
    public void GetUser_ValidUserId_ReturnsUser()
    {
        User user = service.GetById(ValidUserId);

        Assert.IsNotNull(user);
        Assert.AreEqual(ValidUserId, user.UserId);
    }

    [Test, ExpectedException(typeof(UserNotFoundException))]
    public void GetUser_InValidUserId_ThrowsUserNotFoundException()
    {
       service.GetById(InvalidUserId);
    }

    [Test]
    public void Add_User_AddsUser()
    {
        service.Add(newUser);
    }
}

我可以成功测试 GetUser 方法。但我无法在我的服务类中测试 Add 方法。因为它没有返回任何东西。或者我的服务类没有包含用户来查看状态的列表。你对测试这个 void 方法有什么建议?

【问题讨论】:

    标签: unit-testing testing mocking tdd repository


    【解决方案1】:

    根据 FakeItEasy documentation,您可以使用 .MustHaveHappened() 方法,即

    [Test]
    public void Add_User_AddsUser()
    {
        service.Add(newUser);
        A.CallTo(() => repository.Add(A<User>.Ignored)).MustHaveHappened();         
    }
    

    【讨论】:

    • MustHaveHappened 是什么意思,文档中只写了断言。我应该在 service.Add(newUser); 之后使用它吗?
    • “必须发生”检查当您调用 service.Add() 时是否调用了 repository.Add()。如果没有调用 repository.Add() ,测试将失败。如果有,则测试将通过。通过检查 repository.Add() 是否被调用,您可以断言调用 service.Add() 会调用存储库。然后由存储库实际添加用户。
    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多