c# - Moq EF 6 DBSet,设置 FirstOrDefault 方法

标签 c# entity-framework moq

我想测试私有(private)方法。当我设置 FirstOrDefault 方法时,Moq 引发了异常。在我的算法中,我想检查一下,我的方法是否正确地创建了新对象。 请参阅下面的代码。

//Arrange
var data = new List<TypeValue>();

var typeValueMockSet = new Mock<DbSet<TypeValue>>();

typeValueMockSet
    .As<IList<TypeValue>>()
    .Setup(m => m.GetEnumerator())
    .Returns(data.GetEnumerator());

//throw the Error => Expression references a method that does not belong to the mocked object:
// m => m.FirstOrDefault<TypeValue>(It.IsAny<Expression`1>())
typeValueMockSet                                                                
    .Setup(m => m.FirstOrDefault(It.IsAny<Expression<Func<TypeValue, bool>>>()))
    .Returns(data.FirstOrDefault());

typeValueMockSet
    .Setup(m => m.Add(It.IsAny<TypeValue>()))
    .Returns((TypeValue vt) => vt)
    .Callback((TypeValue vt) => data.Add(vt));

var mockContext = new Mock<EngineeringWorkEntities>();
mockContext.Setup(m => m.TypeValues).Returns(typeValueMockSet.Object);

int counter = 0;
mockContext
    .Setup(m => m.SaveChanges())
    .Returns(0)
    .Callback(() => data
        .ForEach(
        (item) => 
        { 
            item.Id = counter;
            counter++;
        }));

//Act
IMakro makroDateGenerate = new MakroDataGenerate(mockContext.Object);

var pObj = new PrivateObject(makroDateGenerate);

int r1 = (int)pObj.Invoke("GetTypeValueId", "0,2% k/k");        //2 

最佳答案

你不能模拟 FirstOrDefault因为它是一种扩展方法。它不属于 List<T>或其他任何内容。

关于c# - Moq EF 6 DBSet,设置 FirstOrDefault 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22429468/

相关文章:

c# - ScrollViewer.ChangeView 什么时候失败?

c# - NullReferenceException 将输入发送到 TextBox

c# - 将电子邮件服务器集成到 ASP.NET 中

c# - 使用 Asp.Net 身份数据库第一种方法

c# - Moq - 验证在测试执行期间更改参数的调用

Twitter API 的 C# DateTime created_at 字段

c# - ASP.NET MVC5 : Want to update several items in Collection with model binding

c# - 在运行时创建类和项目的属性

c# - 使用 MStest 和最小起订量测试 TryUpdateModel()

c# - 设置最小起订量更新测试