Moq EF 6 DBSet, Setup FirstOrDefault method

本文关键字:Setup FirstOrDefault method DBSet EF Moq | 更新日期: 2023-09-27 17:50:29

我想测试私有方法。当我设置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 

Moq EF 6 DBSet, Setup FirstOrDefault method

您不能模拟FirstOrDefault,因为它是一个扩展方法。它不属于List<T>或其他任何东西

除了在单元测试中使用Reflection之外,您不能测试私有方法。这很麻烦。无论如何,您都应该测试公共接口。

将方法设为public或internal。如果您使它成为内部的,您可以允许单元测试项目通过使用InternalsVisibleToAttribute来查看它。

[assembly:InternalsVisibleTo("MyUnitTestProject")]