“任意”上的最小起订量存根属性值;对象

本文关键字:存根 属性 对象 任意 | 更新日期: 2023-09-27 18:17:08

我正在编写一些代码,这些代码遵循将方法的所有参数封装为"请求"的模式。对象并返回一个"响应"。对象。然而,这在嘲弄最小起订量时产生了一些问题。例如:

public class Query : IQuery
{
    public QueryResponse Execute(QueryRequest request)
    {
        // get the customer...
        return new QueryResponse { Customer = customer };
    }
}
public class QueryRequest
{
    public string Key { get; set; }
}
public class QueryResponse
{
    public Customer Customer { get; set; }
}

…在我的测试中,我希望存根查询,以便在给定键时返回客户

var customer = new Customer();
var key = "something";
var query = new Mock<ICustomerQuery>();
// I want to do something like this (but this does not work)
// i.e. I dont care what the request object that get passed is in but it must have the key value I want to give it
query.Setup(q => q.Execute(It.IsAny<QueryRequest>().Key = key))
     .Returns(new QueryResponse {Customer = customer});

最小起订量是我想要的吗?

“任意”上的最小起订量存根属性值;对象

您正在寻找的是It.Is<T>方法,您可以为参数指定任何匹配器函数(Func<T, bool>)。

例如检查键:

query.Setup(q => q.Execute(It.Is<QueryRequest>(q => q.Key == key)))
     .Returns(new QueryResponse {Customer = customer});

我怀疑你可以用自定义匹配器来做到这一点。

从moq的快速入门页面:

// custom matchers
mock.Setup(foo => foo.Submit(IsLarge())).Throws<ArgumentException>();
...
public string IsLarge() 
{ 
  return Match.Create<string>(s => !String.IsNullOrEmpty(s) && s.Length > 100);
}

我怀疑你也可以做类似的事情。创建一个使用Match.Create<QueryRequest>来匹配key的方法,例如

public QueryRequest CorrectKey(string key)
{
    return Match.Create<QueryRequest>(qr => qr.Key == key);
}

_query.Setup(q => q.Execute(CorrectKey(key))).Returns(new QueryResponse {Customer = customer});

注意:我没有尝试过这段代码,所以如果它完全崩溃了,请原谅我。

哦,对于一些稍微相关的自我宣传:正是这种复杂性让我对Moq和其他mock工具感到困扰。这就是为什么我创建了一个mock库,允许您使用正常代码检查方法参数:http://github.com/eteeselink/FakeThat。它正处于一个主要的重构(和重命名)过程的中间,所以您可能需要屏住呼吸。尽管如此,我还是很想听听你的意见。

编辑:哦,@nemesv先我一步,有一个(可能)更好的答案。啊好。