MOQ返回返回Null

时间:2017-04-28 02:02:13

标签: c# tdd moq

我目前正在使用我的testproject以同样的方式测试我的所有域实体。因此,我创建了一个基类,它将由我的所有测试类继承,以确保它们共享相同的行为。

除了GetByPrimaryKey之外,我的所有方法都可以正常工作,GetByPrimaryKey在返回我的类型实例时返回null。

基类的实现:

[TestClass]
public abstract class RepositoryTestBase<E, C>
    where E : EntityBase
    where C : IDBContext
{
    protected E MockedEntity;

    protected IRepository<E, C> Repository { get { return _mockedRepository.Object; } }

    private Mock<IRepository<E, C>> _mockedRepository;

    [TestInitialize]
    public void Init()
    {
        MockedEntity = System.Activator.CreateInstance<E>();

        _mockedRepository = new Mock<IRepository<E, C>>();

        _mockedRepository.Setup(f => f.Add(MockedEntity)).Callback(() => { MockedEntity.Id = 1; });

        _mockedRepository.Setup(f => f.GetByPrimaryKey(MockedEntity.Id)).Returns(MockedEntity);

        _mockedRepository.Setup(f => f.Update(MockedEntity)).Callback(() => { MockedEntity.AlteradoEm = DateTime.Now; });

        _mockedRepository.Setup(f => f.Remove(MockedEntity)).Callback(() => { MockedEntity.Deleted = true; });
    }
}

如何使Returns()方法返回一个对象而不是返回null?为什么它会返回null?提前谢谢。

2 个答案:

答案 0 :(得分:2)

由于您只有一个MockedObject,因此您不必非常关心模拟存储库设置中的输入参数。

因此,您可以执行以下操作:

_mockedRepository.Setup(f => f.GetByPrimaryId(It.IsAny<int>()).Returns(MockedEntity);

您的实体的类型在哪里&#39; key(或其他&#34; GetByPrimaryId&#34;期待)

答案 1 :(得分:0)

  

为什么它会返回null?

Id有可能改变。使用在设置时默认为MockedEntity.Id的常量0会导致您遇到的问题,因为如果您在已将模拟方法添加到存储库后调用模拟方法{{1不匹配,不会行使模拟行为。

  

如何使Returns()方法返回一个对象而不是返回null?

相反,在设置中使用Id并将提供的Returns()与实体的当前It.IsAny<int>()进行比较,使Id语句变得灵活,只返回实体Ids匹配。

Id