1

我正在使用Machine.Fakes.NSubstitute并且想要“伪造”一个返回值,这样如果输入参数与特定值匹配,则返回模拟对象,否则返回 null。

我尝试了以下方法:

host.WhenToldTo(h => h.GetTenantInstance(Param.Is(new Uri("http://foo.bar"))))
    .Return(new TenantInstance());

但它会引发以下异常:

System.InvalidCastException:无法将“System.Linq.Expressions.NewExpression”类型的对象转换为“System.Linq.Expressions.ConstantExpression”类型。

我目前的解决方法是执行以下操作:

host.WhenToldTo(h => h.GetTenantInstance(Param.IsAny<Uri>()))
    .Return<Uri>(uri => uri.Host == "foo.bar" ? new TenantInstance() : null);

这有点臭。

4

1 回答 1

3

我在这里看到三个方面:

  1. 当在模拟对象上调用具有引用类型返回值的方法并且没有为调用设置任何行为时,模拟对象将返回一个模拟。如果您希望它返回null,则必须明确配置它。因此,仅设置是不够的

    host.WhenToldTo(h => h.GetTenantInstance(Param.Is(new Uri("http://foo.bar"))))
        .Return(new TenantInstance());
    

    您还必须使用以下内容设置另一种情况:

    host.WhenToldTo(h => h.GetTenantInstance(Param<Uri>.Matches(x => !x.Equals(new Uri("http://foo.bar")))))
        .Return((TenantInstance)null);
    

    我发现您的“解决方法”解决方案比这两种设置更优雅。

  2. 当您为相等性匹配方法调用参数时,无需使用Param.Is(). 您可以简单地设置行为

    host.WhenToldTo(h => h.GetTenantInstance(new Uri("http://foo.bar")))
        .Return(new TenantInstance());
    
  3. Param.Is()在这里使用时出现异常的事实是Machine.Fakes 的缺点。我看不出为什么这不起作用。我会在某个时候纠正它并让你知道。
于 2012-11-24T15:04:16.800 回答