【问题标题】:How to Test Void Method using xUnit?如何使用 xUnit 测试 Void 方法?
【发布时间】:2014-02-23 15:23:13
【问题描述】:

我想对不返回任何内容的方法进行单元测试。我为此使用 xUnit。我在 Google 中搜索,但我看到的每个方法都返回了一些东西。

这是我的代码:

我的班级:

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。
  • 只是模拟 2013.3.1015
  • xUnit 1.9.2

【问题讨论】:

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


    【解决方案1】:

    有两种可能的解决方案:

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

    2. 模拟 base.Update 方法以返回“预期”并据此断言。

    【讨论】:

      【解决方案2】:

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

      最好的方法是返回一个布尔值来判断它是否更新。

      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,因为这将更新所做的更改,但如果记录尚不存在,也会添加新记录。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-27
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多