具有签名IList的设置方法<t>获取<t>(Guid id,表达式<func <entityname,t =“”>&gt;选择器)

时间:2017-11-23 07:26:52

标签: c# unit-testing moq

我已经彻底搜索了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。所有   模拟上的调用必须有相应的设置。

0 个答案:

没有答案