【问题标题】:InMemoryDb unit test exceptionInMemoryDb 单元测试异常
【发布时间】:2015-05-18 07:02:37
【问题描述】:

我尝试为存储库编写单元测试。我使用 InMemoryDb (https://www.nuget.org/packages/FakeDbSet) 设置来模拟 DbSet 但我得到了异常

“表达式不是方法调用:p => p”。

我哪里错了?

        try
        {
            var userDbSet = new InMemoryDbSet<UserModel>();
            userDbSet.Add(new UserModel { Id = 1, Username = "jacek_001@wp.pl" });
            userDbSet.Add(new UserModel { Id = 1, Username = "jacek_002@wp.pl" });
            userDbSet.Add(new UserModel { Id = 1, Username = "jacek_003@wp.pl" });

            var repositoryMock = new Mock<IDbSet<UserModel>>();
            repositoryMock.Setup(p => p).Returns(() => userDbSet); // <= this line throw exception

            var entitiesMock = new Mock<Entities>();
            entitiesMock.Setup(p => p.Users).Returns(() => repositoryMock.Object);

            return entitiesMock.Object;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }

【问题讨论】:

  • 你想用这条线做什么repositoryMock.Setup(p =&gt; p).Returns(() =&gt; userDbSet);
  • 您需要在-repositoryMock.Setup(p => p.SomePropertyHere)...处正确指定表达式......
  • 我使用 Moq 作为模拟库。我想替换/模拟 UserModel

标签: c# .net entity-framework unit-testing mockdbset


【解决方案1】:

InMemoryDbSet 已经实现了 IDbSet,因此您无需对其进行模拟。 只需将 userDbSet 传递给需要 IDbSet 实例的方法/构造函数。

至于您得到的错误,Setup 方法需要一个导致方法(或属性 getter)调用的表达式,但您提供了一个“实例”结果表达式。 例如。应该是:

var repositoryMock = new Mock<IDbSet<UserModel>>();
repositoryMock.Setup(p => p.SomeMethod()).Returns(() => stubData); 

【讨论】:

    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 2015-03-24
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多