- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 JustMock 模拟 Entity Framework 6.0.2 异步方法。我正在关注 testing with async queries但它是使用最小起订量编写的我试图在Mock Multiple Interfaces的帮助下将其转换为JustMock但出现异常:
The provider for the source IQueryable doesn't implement IDbAsyncQueryProvider. Only providers that implement IDbAsyncQueryProvider can be used for Entity Framework asynchronous operations. For more details see http://go.microsoft.com/fwlink/?LinkId=287068.
这是我的代码:
var dummyData = GetEmployeeSkills();
var mockSet = Mock.Create<DbSet<EmployeeSkill>>();
(mockSet as IDbAsyncEnumerable<EmployeeSkill>).Arrange(x => x.GetAsyncEnumerator())
.Returns(new TestDbAsyncEnumerator<EmployeeSkill>(dummyData.GetEnumerator()));
(mockSet as IQueryable<EmployeeSkill>).Arrange(x => x.Provider).Returns(new TestDbAsyncQueryProvider<EmployeeSkill>(dummyData.Provider));
(mockSet as IQueryable<EmployeeSkill>).Arrange(x => x.Expression).Returns(dummyData.Expression);
(mockSet as IQueryable<EmployeeSkill>).Arrange(x => x.ElementType).Returns(dummyData.ElementType);
(mockSet as IQueryable<EmployeeSkill>).Arrange(x => x.GetEnumerator()).Returns(dummyData.GetEnumerator());
var mockContext = Mock.Create<TimeSketchContext>();
mockContext.Arrange(x => x.Set<EmployeeSkill>()).Returns(mockSet);
baseRepository = new BaseRepository<EmployeeSkill>(mockContext);
private EmployeeSkill GetEmployeeSkill()
{
return new EmployeeSkill
{
SkillDescription = "SkillDescription",
SkillName = "SkillName",
Id = 1
};
}
private IQueryable<EmployeeSkill> GetEmployeeSkills()
{
return new List<EmployeeSkill>
{
GetEmployeeSkill(),
GetEmployeeSkill(),
GetEmployeeSkill(),
}.AsQueryable();
}
测试:
[Fact]
public async Task DbTest()
{
var data = await baseRepository.FindAsync(1);
Assert.NotEqual(null, data);
}
存储库:
public class BaseRepository<T> : IRepositoryBase<T> where T : class, IEntity, new()
{
protected readonly DbContext InnerDbContext;
protected DbSet<T> InnerDbSet;
public BaseRepository(IDbContext innerDbContext)
{
InnerDbContext = innerDbContext as DbContext;
InnerDbSet = innerDbContext.Set<T>();
}
public virtual Task<T> FindAsync(long id)
{
return InnerDbSet.FirstOrDefaultAsync(x=>x.Id == id);
}
}
接口(interface):
public interface IDbContext
{
DbSet<T> Set<T>() where T : class;
}
上下文:
public class TimeSketchContext : DbContext, IDbContext
{
public virtual DbSet<EmployeeSkill> EmployeeSkill { get; set; }
}
最佳答案
因为JustMock可以在你写的时候mock非虚方法
var mockContext = Mock.Create<TimeSketchContext>();
mockContext.Arrange(x => x.Set<EmployeeSkill>()).Returns(mockSet);
它将模拟 DbContext.Set<>
而不是你的 IDbContext.Set<>
所以你得到了异常(exception)。
至少有两种解决方案:
模拟你的 IDbContext
界面
var mockContext = Mock.Create<IDbContext>();
或者改回你的BaseRepository
使用 DbContext
而不是你的界面:
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 Task<T> FindAsync(long id)
{
return InnerDbSet.FirstOrDefaultAsync(x => x.Id == id);
}
}
关于c# - 如何使用 JustMock 模拟 EF 6 异步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21067538/
使用 JustMock,我可以安排一个模拟来根据输入参数返回一些东西吗? 例如,假设一个方法接受一个 int , 我想返回那个值 + 1 我希望输出总是被模拟为输入+1,但我不知道设计时的输入。 我对
为了编写单元测试,我需要为基于 WinRT 的应用程序集成一个模拟框架,并决定哪个模拟框架最适合。我最终比较了 JustMock(许可版)和最小起订量。我找不到两者之间的详细比较。然而,一些文章说,就
我使用 JustMock 框架并有以下断言: Mock.Assert(() => activityListenerMock.PeriodPassed( Arg.Matches(e => e.Len
我正在使用 JustMock 和 AutoFac 并尝试模拟一组非常简单的对象,但我似乎无法正确使用语法... var labResults = Mock.Create();
我正在尝试使用忽略事件的 JustMock 编写单元测试。 我不想测试事件本身,因为它会调用各种内部函数,而这些函数需要大量的 Mock 工作。 这里是一小段示例代码: public class Sa
我正在尝试测试以下代码: public ICollection ReadCatalog(string familyName) { // Root folder for the family
我正在使用 C#、.NET Framework 4.7、Nunit 3.8.0 和 JustMock Lite 2017.2.821.1 开发 TDD 测试。 当我这样做时: IGenericRepo
当我尝试以下 JustMock 时: var mockedField = Mock.CreateLike(field => field.DisplayName == "Test Display");
我刚刚安装了 Telerik.JustMock.EntityFramework 包,我正在尝试。 我已经试过了: var ctx = EntityFrameworkMock.Create().Prep
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
按照以下网址的指示:http://www.telerik.com/help/justmock/advanced-usage-static-mocking.html 我没有成功模拟 Configurat
在 justmock 中,我们可以通过安排构造函数调用来返回模拟实例而不是实际实例 Mock.Arragne(()=>new MyClass(Arg.IsAny())).IgnoreInstance(
我是 TDD 和单元测试的新手,我有 JustMock 商业版和一周的时间来学习如何使用它。下面是一个接口(interface),一个类和一个通过的测试方法。我必须添加 Class1 faceDoes
我正在尝试使用 JustMock 模拟 Entity Framework 6.0.2 异步方法。我正在关注 testing with async queries但它是使用最小起订量编写的我试图在Moc
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
给定以下条件: 一个非常古老、庞大、没有任何测试覆盖的 C# 遗留代码库 (几乎)每个类都派生自某个接口(interface) 没有什么是密封的 与使用 extract&override + 例如犀牛
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 3 年前。 Improv
我是一名优秀的程序员,十分优秀!