【问题标题】:How to execute expressions in moq Repository?如何在 moq Repository 中执行表达式?
【发布时间】:2015-03-18 05:10:19
【问题描述】:

我有具有函数声明的 IGeneric 存储库

T FindBy(Expression<Func<T, bool>> predicate);

在通用存储库类中

public T FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
    {
        return _dbset.FirstOrDefault(predicate);
    }

并拥有单元测试类, 创建一个模拟存储库并将数据初始化到模拟数据库中

[TestClass]
public class ServiceTest
{
    private IClientRepository mockClientRepository;
public ServiceTest()
    {
        IList<ClientData> client = new List<ClientData>
            {
                new ClientData{ Name= "Mike", Address ="Uk" },
                new ClientData{ Name= "Jane", Address ="US" },
            };
         Mock<IClientRepository> _mockRepository = new Mock<IClientRepository>();
        _mockRepository.Setup(m => m.FindBy(It.IsAny<Expression<Func<ClientData, bool>>>())).Returns((string apiClient) =>
        {
            var data = client.Where(x => x.Hash == apiClient).FirstOrDefault();
            return data;
        });
this.mockClientRepository = _mockRepository.Object;
} 
[TestMethod]
public void IsDataFindByName()
    {
        ClientData testResult = this.mockClientRepository.FindBy(i => i.Name== "Mike");
        Assert.IsNotNull(testResult);
    }

我在运行测试时发现异常

Additional information: Object of type 'System.Linq.Expressions.Expression`1[System.Func`2[Adminportal.Entities.ClientData ,System.Boolean]]' cannot be converted to type 'System.String'.

我不知道如何通过它,

【问题讨论】:

  • 附带说明:这是您的完整测试代码吗?在提供的代码中,您伪造了 IClientRepository.FindBy 的实现并测试了该伪造的实现,从而有效地测试了测试代码。鉴于此处显示的情况,此测试不会测试一行生产代码并提供零值。

标签: c# .net asp.net-mvc unit-testing repository


【解决方案1】:

有参数的​​Returns 方法期望其参数与模拟方法的参数类型相同。当需要Expression&lt;Func&lt;ClientData, bool&gt;&gt; 时,您使用.Returns((string apiClient)。只需将其更改为:

.Returns((Expression<Func<ClientData, bool>> expression) =>
{
    var data = client.Where(expression.Compile()).FirstOrDefault();
    return data;
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2019-12-30
    • 2022-10-07
    相关资源
    最近更新 更多