C#如何使用Moq entityframework数据库集添加方法

C#如何使用Moq entityframework数据库集添加方法,c#,unit-testing,c#-4.0,entity-framework-4,moq,C#,Unit Testing,C# 4.0,Entity Framework 4,Moq,我正在尝试创建一个测试到测试实体框架Add方法。任何人都可以帮助模拟DbSet.Add方法。我试过以下方法,但没有效果。我做错了什么 我得到的结果是repository.Insert之后的null Test.cs: var productToCreate = new Product { Name = "Added", Description = "Added" }; var result = repository.InsertAsync(objToCreate, userCon

我正在尝试创建一个测试到测试实体框架
Add
方法。任何人都可以帮助模拟
DbSet.Add
方法。我试过以下方法,但没有效果。我做错了什么

我得到的结果是
repository.Insert
之后的
null

Test.cs:

var productToCreate = new Product { Name = "Added", Description = "Added" };        

var result = repository.InsertAsync(objToCreate, userContext).Result;
Assert.AreEqual(result.Name, "Added");  
Mock.cs

internal static DbSet<T> GetMockedDataSet<T>(IEnumerable<T> data) where T : class
{
    // Create a mocked data set that contains the data
    var set = new Mock<DbSet<T>>();
    set.As<IDbAsyncEnumerable<T>>()
        .Setup(m => m.GetAsyncEnumerator())
        .Returns(new TestDbAsyncEnumerator<T>(data.GetEnumerator()));
    set.As<IQueryable<T>>()
        .Setup(m => m.Provider)
        .Returns(new TestDbAsyncQueryProvider<T>(data.AsQueryable().Provider));
    set.As<IQueryable<T>>().Setup(m => m.Expression).Returns(data.AsQueryable().Expression);
    set.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(data.AsQueryable().ElementType);
    set.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

    set.Setup(x => x.AsNoTracking()).Returns(set.Object);
    set.Setup(x => x.Add(It.IsAny<T>())).Callback<T>((s) => data.Concat(new[] { s }));

    // Return the mock
    return set.Object;
}
内部静态DbSet GetMockedDataSet(IEnumerable数据),其中T:class
{
//创建包含数据的模拟数据集
var set=newmock();
set.As()
.Setup(m=>m.GetAsyncEnumerator())
.Returns(新的TestDbAsyncEnumerator(data.GetEnumerator());
set.As()
.Setup(m=>m.Provider)
.Returns(新的TestDbAsyncQueryProvider(data.AsQueryable().Provider));
set.As().Setup(m=>m.Expression).Returns(data.AsQueryable().Expression);
set.As().Setup(m=>m.ElementType).Returns(data.AsQueryable().ElementType);
set.As().Setup(m=>m.GetEnumerator()).Returns(data.GetEnumerator());
Setup(x=>x.AsNoTracking()).Returns(set.Object);
Setup(x=>x.Add(It.IsAny()).Callback((s)=>data.Concat(new[]{s}));
//归还模拟
返回set.Object;
}
存储库:

public async Task<Product> InsertAsync(Product input)
{
    using (var ctx = .....))
    {
        var added = ctx.Set<Product>().Add(input);

        await ctx.ValidateAndSaveAsync();

        return added;
    }
}
public异步任务InsertAsync(产品输入)
{
使用(var ctx=…))
{
var added=ctx.Set().Add(输入);
等待ctx.ValidateAndSaveAsync();
增加了退货;
}
}

根据在测试方法中如何使用
添加
方法

var added = ctx.Set<Product>().Add(input);
但是考虑到上下文依赖性的信息是未知的

using (var ctx = .....))
不确定提供的解决方案是否能达到预期效果

另外,如果测试异步方法,不要混合使用异步和同步调用。下面一行

var result = repository.InsertAsync(objToCreate, userContext).Result;
…可能导致死锁

使测试方法始终异步

[TestMethod]
public async Task InsertAsync_Should_Return_Product() {
    //...other code

    var expected = new Product { Name = "Added", Description = "Added" };        

    var actual = await repository.InsertAsync(expected, userContext);

    Assert.AreEqual(expected.Name, actual.Name);  
}

根据测试方法中如何使用
Add
方法

var added = ctx.Set<Product>().Add(input);
但是考虑到上下文依赖性的信息是未知的

using (var ctx = .....))
不确定提供的解决方案是否能达到预期效果

另外,如果测试异步方法,不要混合使用异步和同步调用。下面一行

var result = repository.InsertAsync(objToCreate, userContext).Result;
…可能导致死锁

使测试方法始终异步

[TestMethod]
public async Task InsertAsync_Should_Return_Product() {
    //...other code

    var expected = new Product { Name = "Added", Description = "Added" };        

    var actual = await repository.InsertAsync(expected, userContext);

    Assert.AreEqual(expected.Name, actual.Name);  
}

提供一个复制问题的方法。@Nkosi,对不起,我不明白你的意思是什么?我已经提供了我的代码块,并解释了我期望的是什么?。谢谢这个例子不完整。未知因变量太多,无法重新创建问题,测试中的方法与测试中显示的不同,显示的设置不完整……需要我继续吗?提供一个复制问题的方法。@Nkosi,对不起,我不明白你的意思?我已经提供了我的代码块,并解释了我期望的是什么?。谢谢这个例子不完整。太多的因变量未知,无法重新创建问题,测试中的方法与测试中显示的不同,显示的设置不完整…我需要继续吗?哇!它很有魅力。非常感谢。我将testmethod更改为使用async。感谢您的提醒-您对add方法的回调没有任何作用。它对提供的原始收藏没有影响。哇!它很有魅力。非常感谢。我将testmethod更改为使用async。感谢您的提醒-您对add方法的回调没有任何作用。它对提供的原始收藏没有影响。