【问题标题】:How can I mock a property setter in NSubstitute如何在 NSubstitute 中模拟属性设置器
【发布时间】:2021-09-09 16:42:51
【问题描述】:

这是我尝试做的:

    Public Interface IDAO(Of T) : Inherits IDAO
        Default Property Value(i As ULong) As T
        Function Append(ts As ICollection(Of T)) As ULong
        Function Remove(f As Predicate(Of T)) As ICollection(Of T)
        Function GetRestricted(f As Predicate(Of T)) As ICollection(Of T)
        Function RemoveFirst(f As Predicate(Of T)) As T
        Function GetFirst(f As Predicate(Of T)) As T
    End Interface
'...
_mock.WhenForAnyArgs(
    Function(mock As IDAO(Of T)) mock.Value(Arg.Any(Of ULong)) = Arg.Any(Of T)()
).Do(
    Sub(c As Core.CallInfo) Exit Sub 'Value(i) ... Set(v) ... _inner.data(i) = v                                                                                                 
)

模式选择器Function(mock As IDAO(Of T)) mock.Value(Arg.Any(Of ULong)) = Arg.Any(Of T)() 不起作用;即使是这样,我也不知道如何在Do 语句中使用CallInfo 对象。

【问题讨论】:

  • 仅供参考,奇怪的 Enum Voidnull As Void 是这样我可以对通常无法选择且不允许 Do 语句的方法进行模式选择。

标签: .net vb.net unit-testing mocking nsubstitute


【解决方案1】:

我不确定如何在 VB 中执行此操作,但这里是如何在 C# 中执行此操作,希望您或其他人可以翻译。

    public interface IDao
    {
        ulong Value { get; set; }
    }

    [SuppressMessage("Argument specification", "NS3002:Can not find an argument to this call.", Justification = "Used in property set")]
    [Fact]
    public void PropertySetExample() {
        var sub = Substitute.For<IDao>();
        var value = 0ul;
        sub.WhenForAnyArgs(x => x.Value = 0ul).Do(callInfo =>
          // This will be called when sub.Value is set. 
          // For this example we just assign to a local variable.
          value = callInfo.Arg<ulong>()
        );

        sub.Value = 42;

        Assert.Equal(42ul, value);
    }

(仅NSubstitute.Analyzers 需要SuppressMessage,因为它不确定属性集的参数。)

【讨论】:

  • 感谢您的回答,但是当属性需要参数x.prop(...) = ... 时会发生什么?在这种情况下,我不确定如何导航 callInfo。
  • 如果有 AB 不同类型的属性的参数,您可以使用 callInfo.Arg&lt;A&gt;()callInfo.Arg&lt;B&gt;() 访问。如果有相同类型的参数,您可以通过callInfo.ArgAt&lt;T&gt;(index) 访问它们,或者使用callInfo[index] 并转换为正确的类型。您还可以通过callInfo.Args() 访问所有参数。
猜你喜欢
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多