如何使用xUnit测试Void方法?

时间:2014-02-23 15:23:13

标签: c# .net unit-testing mocking xunit

我想对一个什么都不返回的方法进行单元测试。我正在使用xUnit。我在谷歌搜索,但我看到的方法都返回了一些东西。

这是我的代码:

我的班级:

public class ShopRepository : BaseRepository<ShopInformation>
{
    public ShopRepository(IDbContext dbContext)
        : base(dbContext)
    {
    }

    public override void Update(ShopInformation entity)
    {
        if(GetAll().Any())
            base.Update(entity);
        else
         base.Add(entity);
    }

    public ShopInformation ShopInformation()
    {
        return GetAll().FirstOrDefault();
    }
}

我的测试:

    [Fact]
    public void GetAllTest()
    {
        var data = new List<ShopInformation>
        {
            new ShopInformation { Name = "BBB" },
            new ShopInformation { Name = "ZZZ" },
            new ShopInformation { Name = "AAA" },
        }.AsQueryable();

        var mockSet = Mock.Create<DbSet<ShopInformation>>();
        Mock.Arrange(() => ((IEnumerable<ShopInformation>)mockSet).GetEnumerator()).Returns(data.GetEnumerator);

        Mock.Arrange(() => ((IQueryable<ShopInformation>)mockSet).Provider).Returns(data.Provider);

        Mock.Arrange(() => ((IQueryable<ShopInformation>)mockSet).Expression).Returns(data.Expression);
        Mock.Arrange(() => ((IQueryable<ShopInformation>)mockSet).ElementType).Returns(data.ElementType);
        Mock.Arrange(() => ((IQueryable<ShopInformation>)mockSet).GetEnumerator()).Returns(data.GetEnumerator());
        var interDbContext = Mock.Create<IDbContext>();
        interDbContext.Arrange(x => x.Set<ShopInformation>()).Returns(mockSet);

        var companyRepository = new ShopRepository(interDbContext);

        companyRepository.Update(new ShopInformation());

       //???????????????

    }

我需要测试Update类的ShopRepository方法,以确保调用base.Update(entity);。但不明白如何做到这一点。

我正在使用:

  • Visual Studio 2013 Ultimate。
  • Just Mock 2013.3.1015
  • xUnit 1.9.2

2 个答案:

答案 0 :(得分:0)

有两种可能的解决方案:

  1. 如果Update方法修改ShopRepository类中的任何值,则应对它们执行一些验证。

  2. 模拟base.Update方法返回&#34;期望&#34;并基于此断言。

答案 1 :(得分:0)

  

您的测试名为GetAllTest(),因此可能不应该测试Update()函数。

这样做的最佳方法是返回bool,如果它已更新或未更新。

public bool Update(ShopInformation entity)
{
    if(GetAll().Any())
    {
        base.Update(entity);
        return true; // True because it updated
    }
    else
    {
         base.Add(entity);
         return false; // False because it didn't
    }
}

然后你的测试可以Assert预期的答案。

// ... Setup test code
var hasUpdated = companyRepository.Update(new ShopInformation());
Assert.Equal(true, hasUpdated);
  

需要注意的一点:如果您使用的是存储库,则应该使用Save,因为这会更新所做的更改,但如果记录尚未更新,也会添加新记录存在。