我已经彻底搜索了stackoverflow以获得这个问题的答案,但没有运气。
我简化了测试。我的问题是我无法使用GetEntityFieldsById设置工作。
所以这是我的简化课程:
public class EntityClass
{
public Guid Id { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
一个非常简单的存储库:
public interface IRepository
{
IList<T> GetEntityFieldsById<T>(Guid id, Expression<Func<EntityClass, T>> selector);
}
一个非常简单的类,包含要测试的代码:
public class CodeToTest
{
private readonly IRepository _repository;
public CodeToTest(IRepository repository)
{
_repository = repository;
}
public void MethodToTest(Guid id)
{
var result = _repository.GetEntityFieldsById(id, x => new {x.StartDate, x.EndDate});
//...
}
}
这里我尝试设置GetEntityFieldsById方法,但无法使其工作:
[TestClass]
public class UnitTest1
{
private Mock<IRepository> _repositoryMock;
private CodeToTest _codeToTest;
[TestInitialize]
public void TestInitialize()
{
_repositoryMock = new Mock<IRepository>(MockBehavior.Strict);
_codeToTest = new CodeToTest(_repositoryMock.Object);
}
[TestMethod]
public void TestMethod1()
{
var fakeId = Guid.NewGuid();
SetupGetEntityFieldsById<object>(fakeId, new List<object>());
_codeToTest.MethodToTest(fakeId);
// assert something
}
private void SetupGetEntityFieldsById<T>(Guid id, IList<T> result)
{
_repositoryMock.Setup(
m => m.GetEntityFieldsById(It.Is<Guid>(p => p == id),
It.IsAny<Expression<Func<EntityClass, T>>>()))
.Returns(result);
}
}
当我使用MockBehavior.Strict
时,我在运行测试时遇到经典的“缺少设置”错误:
测试方法UnitTestProject1.UnitTest1.TestMethod1抛出异常: Moq.MockException: IRepository.GetEntityFieldsById&lt;&lt;&gt; f__AnonymousType0
2>(d1b3c6fb-5a5e-4f0a-9f68-191ca6a61bff, x => new <>f__AnonymousType0
2(StartDate = x.StartDate,EndDate = x.EndDate))调用失败,模拟行为为Strict。所有 模拟上的调用必须有相应的设置。