首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个Machine.Fakes参数匹配抛出一个异常?

为什么这个Machine.Fakes参数匹配抛出一个异常?
EN

Stack Overflow用户
提问于 2012-11-22 16:31:26
回答 1查看 1.3K关注 0票数 1

我使用Machine.Fakes.NSubstitute,并希望“伪造”返回值,以便如果输入参数与特定值匹配,则返回模拟对象,否则返回null。

我尝试了以下几点:

代码语言:javascript
复制
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’。

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

代码语言:javascript
复制
host.WhenToldTo(h => h.GetTenantInstance(Param.IsAny<Uri>()))
    .Return<Uri>(uri => uri.Host == "foo.bar" ? new TenantInstance() : null);

有点臭。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-24 15:04:16

我在这里看到三个方面:

  1. 当在模拟对象上调用具有引用类型返回值的方法而没有为调用设置任何行为时,模拟对象将返回一个模拟。如果希望它返回null,则必须显式地配置它。因此,仅仅建立 host.WhenToldTo(h => h.GetTenantInstance(Param.Is(新Uri(“http://foo.bar").Return(新TenantInstance()); 您还必须设置另一个案例,如下所示: host.WhenToldTo(h => h.GetTenantInstance(Param.Matches(x =>!x.Equals(新Uri(“http://foo.bar") .Return((TenantInstance)null); 我发现您的“解决方案”比这两个设置更优雅。
  2. 当匹配相等的方法调用参数时,不需要使用可以简单地将行为设置为 host.WhenToldTo(h => h.GetTenantInstance(新Uri(“http://foo.bar").Return(新TenantInstance());
  3. 在这里使用Param.Is()会出现异常,这是Machine.Fakes的一个缺点。我看不出有什么理由不应该这样做。我会在某个时候纠正这一点,让你知道。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13516849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档