【问题标题】:Can't get Moq to return a value无法让 Moq 返回值
【发布时间】:2016-01-12 10:40:36
【问题描述】:

我正在使用 Moq 对我们使用 Entity Framework 的一些代码进行单元测试。在我的单元测试中,我有以下代码,但是当我测试它时,我无法获得正确的返回值(一切编译正常,但 count 的结果为 0 并返回 null)。这表明我的 Entity 对象从未添加到我的模拟仓库中。

[TestMethod]
public void GetEntity_ValidName_EntityReturned()
{
    Entity testEntity = new Entity();
    testEntity.Name = "Test";

    var mockService = new Mock<IUnitOfWork>();
    mockService.Setup(mock => mock.EntityRepo.Add(testEntity));
    IUnitOfWork testDB = mockService.Object;
    testDB.EntityRepo.Add(testEntity);

    Entity testEntity2 = EntityHelper.getEntity(testDB,testEntity.Name);
    int count = testDB.EntityRepo.Count();

    Assert.AreEqual(testEntity.Name,testEntity2.Name);
}

如何添加实体?我什至需要吗?我还尝试了以下无法编译的方法:

mockService.Setup(mock => mock.EntityRepo.Add(testEntity)).Returns(testEntity);

同上:

mockService.SetupGet(mock => mock.EntityRepo.Add(testEntity)).Returns(testEntity);

编辑:这是测试的目标:

public static Entity getEntity(IUnitOfWork database, string entityName)
{
    Entity _entity = database.EntityRepo.Find(x => x.Name.ToLower().Trim() == entityName).FirstOrDefault();
    return _entity;
}

【问题讨论】:

  • 你能发布测试目标的代码吗?一般来说,你只需要返回你将在测试中使用的东西。
  • 我现在就添加它

标签: c# entity-framework unit-testing moq


【解决方案1】:

这是你需要模拟的命令:

database.EntityRepo.Find

您无需担心模拟服务,只需 IUnitOfWork 比如:

testDB.Setup(m => m.Find(It.IsAny<object[]>())).Returns(new List<Entity>() entity);

工作示例:

由于双点,我们需要在IUnitOfWork 上为EntityRepo 挂一个模拟

[TestMethod]
public void GetEntity_ValidName_EntityReturned()
{
    Entity testEntity = new Entity();
    testEntity.Name = "Test";

    var mockEntityRepo = new Mock<IRepo>(); // Type of Repo here
    var mockService = new Mock<IUnitOfWork>();
    mockService.Setup(m => m.EntityRepo).Returns(mockEntityRepo.Object);

    mockEntityRepo.Setup(m => m.Find(It.IsAny<Expression<Func<Entity, bool>>>())).Returns(testEntity);

    Entity testEntity2 = EntityHelper.getEntity(mockService.Object, testEntity.Name);
    int count = testDB.EntityRepo.Count();

    Assert.AreEqual(testEntity.Name,testEntity2.Name);
}

模拟设置应该对应于被测试方法中的调用。

【讨论】:

  • 我在 m.Find 收到一个错误,说我的 IUnitOfWork 不包含“Find”的方法定义(如果我遗漏了一些超级简单的东西,请致歉;对实体框架来说非常新单元测试!)
  • 不,这是我的错,我错过了两个点。 EntityRepo 是什么?
  • 对不起,这是我的错,我有 mockService.Setup 而不是 testDB.Setup(虽然现在说 testDB 没有 .Setup 的方法定义)
  • @Novastorm 这应该可以工作,假设你把你的存储库类型放在那里我已经发表了评论
  • 设法构建了大部分测试,但是我在第 57 行的末尾遇到了一些关于 m.Find 和实体的问题。我没有试图解释,而是上传了一个此处的屏幕截图以及错误消息:i.imgur.com/xzGFi36.png
猜你喜欢
  • 2016-06-26
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多