2014-02-23 124 views
1

我想對不返回任何內容的方法進行單元測試。我正在使用xUnit。我在谷歌搜索,但每個我看到的方法正在返回的東西。如何使用xUnit測試void方法?

這裏是我的代碼:

我的班級:

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()); 

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

    } 

我需要測試ShopRepositoryUpdate方法,以確保base.Update(entity);是調用。但不明白如何去做。

我使用:

  • 的Visual Studio 2013旗艦版。
  • 只是模擬2013.3.1015
  • 的xUnit 1.9.2

回答

0

有2級可能的解決方案:

  1. 如果更新方法修改從ShopRepository類中的任何值,你應該進行一些驗證他們。

  2. 模擬出base.Update方法以基於此返回「expected」和斷言。

0

您的測試被命名爲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,因爲這將更新所做的更改,但也將增加新的記錄,如果記錄不存在。