2014-01-08 34 views
0

我是嘲笑新人。我試圖用JustMock來模擬我的dbContext。我正在使用實體框架6.在實體框架6中,一些功能是異步的。我成功地模擬同步方法,並且我的測試成功通過。但我陷入異步方法。 我的測試仍然通過後,我把錯誤的斷言。如何在JustMock中模擬異步方法?

這裏是我的代碼:

基礎信息庫:

public class BaseRepository<T> : IRepositoryBase<T> where T : class, IEntity, new() 
{ 
    protected readonly DbContext InnerDbContext; 
    protected DbSet<T> InnerDbSet; 

    public BaseRepository(DbContext innerDbContext) 
    { 
     InnerDbContext = innerDbContext; 
     InnerDbSet = InnerDbContext.Set<T>(); 
    } 

    public virtual void Add(T entity) 
    { 
     InnerDbSet.Add(entity); 
    } 

    public virtual Task<T> FindAsync(long id) 
    { 
     return InnerDbSet.FirstOrDefaultAsync(x => x.Id == id && !x.IsDelete); 
    } 
} 

的DbContext:

public class TimeSketchContext : DbContext 
{ 
    public DbSet<EmployeeSkill> EmployeeSkill { get; set; } 
} 

測試:

public class BaseRepositoryTest 
{ 
    readonly TimeSketchContext _mockDataContext = Mock.Create<TimeSketchContext>(); 
    private BaseRepository<EmployeeSkill> _repository; 
    public BaseRepositoryTest() 
    { 
     _repository = new BaseRepository<EmployeeSkill>(_mockDataContext); 
    } 

    [Fact] 
    public void Add_Should_Call_Once() 
    { 
     _repository.Add(Arg.IsAny<EmployeeSkill>()); 
     Mock.Assert(() => _mockDataContext.Set<EmployeeSkill>().Add(Arg.IsAny<EmployeeSkill>()), Occurs.Once()); 
    } 

    [Fact] 
    public async void Find_Should_Call_Once() 
    { 
     await _repository.FindAsync(Arg.AnyInt); 
     Mock.Assert(() => _mockDataContext.Set<EmployeeSkill>().LastOrDefault(x => x.Id == Arg.AnyInt && !x.IsDelete), Occurs.Once()); 
     // This Test Will be fail Because my _repository.FindAsync is call FirstOrDefaultAsync. But it is pass. 
    } 
} 

我使用:

  • 的Visual Studio 2013旗艦版
  • .NET 4.5.1
  • JustMock 2013年第三季度(2013.3.1015.0)
  • 的xUnit

回答

2

我懷疑你的問題是由於async void。 XUnit(我相信)僅在v2和更高版本中支持async void測試。

我建議您將async void測試更改爲async Task