【问题标题】:Moq - Mock Generic RepositoryMoq - 模拟通用存储库
【发布时间】:2010-11-26 21:03:54
【问题描述】:

我有一个通用存储库并试图将 .Returns 转换为表达式,但它拒绝...我的代码如下:

public RepositoryTest()
{
    IList<MockObjectSet> mocks = new List<MockObjectSet>()
    {
        new MockObjectSet { FirstName = "Beta", LastName = "Alpha", Mobile = 12345678 },
        new MockObjectSet { FirstName = "Alpha", LastName = "Beta", Mobile = 87654321 }
    };

    var mockRepository = new Mock<IRepository<MockObjectSet>>();

    mockRepository.Setup(x => x.GetBy(It.IsAny<Expression<Func<MockObjectSet, bool>>>()))
        .Returns((Expression<Func<MockObjectSet, bool>> predicate) => mocks.Where(predicate).ToList());

}

只是说

Delegate System.Func&lt;System.Collections.Generic.IEnumerable&lt;expWEBCRM.Tests.Repositories.MockObjectSet&gt;&gt; does not take 1 arguments

提前致谢!

【问题讨论】:

    标签: c# unit-testing mocking


    【解决方案1】:

    您需要像这样显式指定Returns 重载的类型参数:

    mockRepository.Setup(x => x.GetBy(It.IsAny<Expression<Func<MockObjectSet, bool>>>()))
            .Returns<Expression<Func<MockObjectSet, bool>>>(predicate => mocks.Where(predicate).ToList());
    

    EDIT 存储库接受一个表达式并在IQueryable 上使用它。模拟数据源实际上是一个IEnumerable。 LINQ 接口的不同之处在于一个接受 lambda,一个接受一个表达式:

    IQueryable<T>.Where(Expression<Func<T,bool>>);
    IEnumerable<T>.Where(Func<T,bool>);
    

    在这种情况下发生的情况是尝试用Expression&lt;Func&lt;T,bool&gt;&gt; 调用IEnumerable.Where。解决此问题的最简单方法是将源集合设为IQueryable

    public RepositoryTest()
    {
        IQueryable<MockObjectSet> mocks = new List<MockObjectSet>()
        {
            new MockObjectSet { FirstName = "Beta", LastName = "Alpha", Mobile = 12345678 },
            new MockObjectSet { FirstName = "Alpha", LastName = "Beta", Mobile = 87654321 }
        }.AsQueryable();
    
        var mockRepository = new Mock<IRepository<MockObjectSet>>();
    
        mockRepository.Setup(x => x.GetBy(It.IsAny<Expression<Func<MockObjectSet, bool>>>()))
            .Returns<Expression<Func<MockObjectSet, bool>>>(predicate => mocks.Where(predicate).ToList());
    
    }
    

    【讨论】:

    • 完美!但现在出现另一个错误:'System.Collections.Generic.IList' 不包含'Where' 的定义和最佳扩展方法重载'System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable, System.Func)' 有一些无效参数
    猜你喜欢
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2023-03-28
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多