【问题标题】:Moq EF 6 DBSet, Setup FirstOrDefault methodMoq EF 6 DBSet,设置 FirstOrDefault 方法
【发布时间】:2014-03-15 20:38:58
【问题描述】:

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

【问题讨论】:

  • 我不想概括太多。每个案例都是不同的,所以重要的是一个目标,你为什么要测试你的代码。如果你消除了一个错误,我认为目标已经完成。

标签: c# entity-framework moq


【解决方案1】:

您不能模拟FirstOrDefault,因为它是一种扩展方法。它不属于List&lt;T&gt; 或其他任何东西。

【讨论】:

  • 是的,我同意,我在电脑上休息时碰上了这个
  • 如果你模拟GetEnumeratorFirstOrDefault 将作为扩展方法调用GetEnumerator() 通过使用foreach 如果它使用谓词。如果没有,您需要模拟 Count 和索引 0。为了方便起见,我所做的是创建一个将 IEnumerable 作为构造函数参数的 Enumerator 存根。
【解决方案2】:

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

将方法设为公开或内部。如果将其设为内部,则可以通过使用InternalsVisibleToAttribute 允许单元测试项目看到它。

[assembly:InternalsVisibleTo("MyUnitTestProject")]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2017-06-27
    • 1970-01-01
    • 2016-03-20
    相关资源
    最近更新 更多