如何在NSubstitute中Mock属性setter,解决VB.NET场景下的匹配问题
解决方案
1. 写法错误修正
你原有代码的模式选择器使用Function定义,会被NSubstitute识别为「获取属性值后做相等比较」的表达式,无法匹配setter调用。需要改为Sub定义赋值操作,让框架正确识别你要匹配的是索引属性的setter。
2. CallInfo参数获取规则
索引属性的setter包含两个输入参数:第0位为你定义的索引值i As ULong,第1位为要设置的属性值T,可直接通过CallInfo的泛型方法提取。
完整可运行代码如下:
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( Sub(mock As IDAO(Of T)) mock.Value(Arg.Any(Of ULong)) = Arg.Any(Of T)() ).Do( Sub(c As Core.CallInfo) ' 提取setter的两个参数 Dim index As ULong = c.Arg(Of ULong)(0) Dim setValue As T = c.Arg(Of T)(1) ' 执行你需要的自定义逻辑 _inner.data(index) = setValue End Sub )
如果需要针对特定索引匹配setter,把Arg.Any(Of ULong)替换为对应固定值即可。
内容的提问来源于stack exchange,提问作者user13507303
相关产品推荐
相关产品推荐

