2014-01-08 4 views
0

저는 Mocking에서 새로운입니다. JustMock을 사용하여 dbContext를 모의하려고합니다. Entity Framework 6을 사용하고 있습니다. Entity Framework 6에서는 일부 기능이 비동기입니다. 나는 동기 방법을 성공적으로 모의하고 나의 시험은 성공적으로 통과했다. 하지만 비동기 메서드에 붙어있다. Assert를 잘못 입력 한 후에도 내 테스트가 계속 진행됩니다.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. 
    } 
} 

:

여기

내 코드입니다 6,
  • 비주얼 스튜디오 2013 얼티밋
  • .NET 4.5.1
  • JustMock Q3 2013 (2013.3.1015.0)
  • xUnit의

답변

2

나는 당신의 문제가 async void 때문이라고 생각한다. XUnit (저는 믿습니다)는 v2 이상에서만 async void 테스트를 지원합니다.

async void 테스트를 async Task으로 변경하는 것이 좋습니다.

관련 문제