【问题标题】:How to Mock Asynchronous Methods in JustMock?如何在 JustMock 中模拟异步方法?
【发布时间】:2014-01-27 01:01:42
【问题描述】:

我是 Mocking 的新手。我正在尝试使用 JustMock 模拟我的 dbContext。我正在使用 Entity Framework 6。在 Entity Framework 6 中,一些功能是异步的。我成功地模拟了同步方法,并且我的测试成功通过了。但我被困在异步方法中。 在我输入错误的 Assert 后,我​​的测试仍然通过。

这是我的代码:

基础存储库:

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

数据库上下文:

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 Ultimate
  • .NET 4.5.1
  • JustMock 2013 年第三季度 (2013.3.1015.0)
  • XUnit

【问题讨论】:

    标签: c# .net entity-framework unit-testing justmock


    【解决方案1】:

    我怀疑您的问题是由async void 引起的。 XUnit(我相信)仅在 v2 及更高版本中支持 async void 测试。

    我建议您将 async void 测试更改为 async Task

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      相关资源
      最近更新 更多