我想测试私有方法。当我设置FirstOrDefault方法时Moq抛出Exception。在我的算法中,我想检查一下,我的方法是否正确地创建了新对象。 请参阅下面的代码。
//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
答案 0 :(得分:1)
您无法模拟FirstOrDefault
,因为它是一种扩展方法。它不属于List<T>
或其他任何内容。
答案 1 :(得分:0)
除了在单元测试中使用Reflection
之外,您无法测试私有方法。这非常麻烦。无论如何你应该测试公共接口。
将方法设为公共或内部。如果您将其设置为内部,则可以允许单元测试项目使用InternalsVisibleToAttribute
来查看它。
[assembly:InternalsVisibleTo("MyUnitTestProject")]