我正在尝试设置一个模拟DbSet用于测试目的.我在这里使用了这个教程,http://www.loganfranken.com/blog/517/mocking-dbset-queries-in-ef6/并略微修改了它,所以每次调用GetEnumerator都会返回一个新的枚举器(我遇到的另一个问题) .但是,我在向DbSet添加项目时遇到困难.
输出是preCount = 3 postCount = 3.但是,我希望它是precount = 3 postCount = 4.非常感谢任何帮助.
static void Main(string[] args)
{
Debug.WriteLine("hello debug");
List<string> stringList = new List<string>
{
"a", "b", "c"
};
DbSet<string> myDbSet = GetQueryableMockDbSet(stringList);
int preCount = myDbSet.Count();
myDbSet.Add("d");
int postCount = myDbSet.Count();
Debug.WriteLine("preCount = " + preCount + " postCount = " + postCount);
}
private static DbSet<T> GetQueryableMockDbSet<T>(List<T> sourceList) where T : class
{
var queryable = sourceList.AsQueryable();
var dbSet = new Mock<DbSet<T>>();
dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider); …Run Code Online (Sandbox Code Playgroud) 我正在尝试用FakeDbSet制作一个FakeDbContext进行单元测试.
但是我收到以下错误(见下文).我正在扩展DbSet,所以通常应该实现IDbAsyncEnumerable.当我实现它时,它说没有用.
例外:
System.InvalidOperationException:源IQueryable未实现IDbAsyncEnumerable.只有实现IDbAsyncEnumerable的源才能用于Entity Framework异步操作.有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=287068.
FakeDbSet类:
public abstract class FakeDbSet<TEntity> : DbSet<TEntity>, IEnumerable<TEntity>, IQueryable, IDbAsyncEnumerable<TEntity> where TEntity : Entity, new()
{
#region Private Fields
private readonly ObservableCollection<TEntity> _items;
private readonly IQueryable _query;
#endregion Private Fields
protected FakeDbSet()
{
_items = new ObservableCollection<TEntity>();
_query = _items.AsQueryable();
}
public Expression Expression { get { return _query.Expression; } }
public Type ElementType { get { return _query.ElementType; } }
public IQueryProvider Provider { get { return _query.Provider; } }
public override …Run Code Online (Sandbox Code Playgroud) 我正在使用XUNIT在点网核心应用程序中进行测试.
我需要测试一个内部在我的datacontext中的DbSet上进行异步查询的服务.
我在这里看到,异步模拟DbSet是可能的.
我遇到的问题是,IDbAsyncQueryProvider我正在使用的EntityframeworkCore似乎没有.
我在这里不正确吗?还有其他人有这个工作吗?
(漫长的一天,希望我只是简单地遗漏了一些东西)
编辑
在询问GitHub后,我得到了这个类:https: //github.com/aspnet/EntityFramework/blob/dev/src/Microsoft.EntityFrameworkCore/Query/Internal/IAsyncQueryProvider.cs
这是我到目前为止试图实现的目的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore.Query.Internal;
namespace EFCoreTestQueryProvider
{
internal class TestAsyncQueryProvider<TEntity>: IAsyncQueryProvider
{
private readonly IQueryProvider _inner;
internal TestAsyncQueryProvider(IQueryProvider inner)
{
_inner = inner;
}
IQueryable CreateQuery(Expression expression)
{
return new TestDbAsyncEnumerable<TEntity>(expression);
}
IQueryable<TElement> CreateQuery<TElement>(Expression expression)
{
return new TestDbAsyncEnumerable<TElement>(expression);
}
object Execute(Expression expression)
{
return _inner.Execute(expression);
}
TResult Execute<TResult>(Expression expression)
{
return _inner.Execute<TResult>(expression);
}
IAsyncEnumerable<TResult> …Run Code Online (Sandbox Code Playgroud) 我做了类似的事情:How to mock an async repository with Entity Framework Core in my unit test project .net core 2.1. 现在尝试将其更新为 3.0 预览版,但 IAsyncQueryProvider 出现一些错误。
所以当我更新我的项目时。我的单元测试有一些问题。实际上,IAsyncEnumerable 将 GetEnumerator 切换为 GetAsyncEnumerator。修正了那个。此外,一些接口发生了变化,必须在我的代码中实现。
我在这里的问题是 IAsyncQueryProvider 女巫添加了 TResult IAsyncQueryProvider.ExecuteAsync(Expression expression, CancellationTokenCancellationToken) 我不知道该怎么做,因为自从我更新到 getAsyncEnumerator 我进入我的代码的这一部分并且无法使它工作因为我不知道如何返回 TResult 我试过:
return Execute<TResult>(expression);
return _inner.Execute<TResult>(expression);
throw new NotImplementedException();(:p sorry had to)
internal class TestAsyncQueryProvider<TEntity> : IAsyncQueryProvider
{
private readonly IQueryProvider _inner;
internal TestAsyncQueryProvider(IQueryProvider inner)
{
_inner = inner;
}
public IQueryable CreateQuery(Expression expression)
{
return new TestAsyncEnumerable<TEntity>(expression);
}
public IQueryable<TElement> …Run Code Online (Sandbox Code Playgroud) 我有一个方法的查询:
private readonly IEntityReader<Customer> _reader;
public async Task<IEnumerable<Customer>> HandleAsync(GetCustomer query)
{
var result = _reader.Query()
.Include(customer => customer.Organization)
.Where(customer => customer.Name == query.Name);
return await result.ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)
哪个具有此单元测试:
[Fact]
public async Task HandleGetCustomer_ReturnsCustomer_WhenNameMatches()
{
// Arrange
var customers = new List<Customer>()
{
new Customer
{
Id = new Guid("d4e749ba-6874-40f4-9134-6c9cc1bc95fe"),
Name = "John Doe",
Age = 18,
Organization = new Organization
{
Id = new Guid("b2ba06c9-5c00-4634-b6f7-80167ea8c3f1"),
Name = "TheCompany",
Number = 42
}
},
new Customer
{
Id = new Guid("0679ceb5-3d4f-41f3-a1b0-b167e1ac6d7e"), …Run Code Online (Sandbox Code Playgroud) 我有一些类似下面的代码,我想编写方法的单元测试。但是我陷入了异步方法。你能帮我吗 ?
public class Panel
{
public int Id { get; set; }
[Required] public double Latitude { get; set; }
public double Longitude { get; set; }
[Required] public string Serial { get; set; }
public string Brand { get; set; }
}
public class CrossSolarDbContext : DbContext
{
public CrossSolarDbContext()
{
}
public CrossSolarDbContext(DbContextOptions<CrossSolarDbContext> options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}
}
public interface IGenericRepository<T>
{ …Run Code Online (Sandbox Code Playgroud) c# unit-testing iqueryable entity-framework-6 asp.net-core-2.0
我有这个测试:
[Fact]
public async void Can_Paginate()
{
//fake data
var product1 = new Product { ProductId = 1, ProductName = "P1" };
var product2 = new Product { ProductId = 2, ProductName = "Product 2" };
var product3 = new Product { ProductId = 3, ProductName = "Product 3" };
var product4 = new Product { ProductId = 4, ProductName = "Product 4" };
var product5 = new Product { ProductId = 5, ProductName = "Product 5" };
var data …Run Code Online (Sandbox Code Playgroud)