gpt4 book ai didi

c# - 如何使用 NSubstitute 替换 Object.ToString?

转载 作者:太空狗 更新时间:2023-10-29 17:44:44 25 4
gpt4 key购买 nike

当我尝试使用 NSubstitute 1.7.1.0 来定义 Object.ToString 的行为时(这是一个虚方法),NSubstitute 抛出异常。

重现:

[Test]
public static void ToString_CanBeSubstituted()
{
var o = Substitute.For<object>();
o.ToString().Returns("Hello world");

Assert.AreEqual("Hello world", o.ToString());
}

失败:

NSubstitute.Exceptions.CouldNotSetReturnDueToNoLastCallException : Could not find a call to return from.

Make sure you called Returns() after calling your substitute (for example: mySub.SomeMethod().Returns(value)),
and that you are not configuring other substitutes within Returns() (for example, avoid this: mySub.SomeMethod().Returns(ConfigOtherSub())).

If you substituted for a class rather than an interface, check that the call to your substitute was on a virtual/abstract member.
Return values cannot be configured for non-virtual/non-abstract members.

Correct use:
mySub.SomeMethod().Returns(returnValue);

Potentially problematic use:
mySub.SomeMethod().Returns(ConfigOtherSub());
Instead try:
var returnValue = ConfigOtherSub();
mySub.SomeMethod().Returns(returnValue);

有没有办法让上面的测试通过?

我的天真测试抛出的异常是错误还是“设计使然”?

最佳答案

NSubstitute 基于 Castle.Core库并使用动态代理来拦截和管理调用。两个框架都禁止拦截 Object 类的方法。

  1. 它在 CaSTLe 的 IProxyGenerationHook 默认实现中被抑制。您可以找到代码 here .我认为这是有原因的。当然,可以实现自己的 IProxyGenerationHook 以允许 Object 类的方法拦截,但是...

  2. NSubstitute 还禁止拦截 Object 的方法,原因是 NSubstitute 的语法。 “NSubstitute 记录对替代者的调用,当我们调用 Returns 时,它会获取最后一次调用并尝试将其配置为返回特定值。”假设我们有以下代码:

    var service = Substitute.For<IService>();
    var substitute = Substitute.For<object>();
    service.AMethod(substitute).Returns(1);

    我们在这里调用“AMethod()”,NSub 拦截执行并使其内部事物,假设将“替代”值添加到调用 substitute.GetHashCode() 的字典中。如果我们拦截“GetHashCode()”方法,那么它将是最后一次记录的调用。 NSub 会将指定的返回值绑定(bind)到它,这是错误的。避免这样的事情几乎是不可能的。

关于c# - 如何使用 NSubstitute 替换 Object.ToString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21782603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com