7

我正在测试一个 MVC 控制器,它依赖于从基类上的只读属性返回的值。

此属性的 getter 在调用时会引发异常,因为它依赖于HttpContext我宁愿避免嘲笑的(和其他讨厌的东西)。

这是我迄今为止尝试过的:

controller = Substitute.ForPartsOf<MyController>(
    Substitute.For<SomeDependency>(),
);

controller.UserInfo.Returns(new UserInfo());

然而,一旦访问 UserInfo 就会引发异常。

基类的属性是:

public UserInfo UserInfo
{
    get
    {
        // HttpContext dependent stuff
    }
}

我尝试将基类属性设置为虚拟,但随后出现 Castle 代理异常。

4

1 回答 1

8

我想你可能有另一个问题。NSubstitute 能够处理虚拟属性的替换。这是一个小程序,说明

public class SubstitutedClass
{
    public virtual int SubstitutedProperty { get { throw new InvalidOperationException(); }  }
}

internal class Program
{
    private static void Main(string[] args)
    {
        var test2 = Substitute.For<SubstitutedClass>();
        test2.SubstitutedProperty.Returns(10);
        Console.WriteLine(test2.SubstitutedProperty);
    }
}

编辑:关于您的使用,ForPartsOf我认为不可能以这种方式覆盖属性,因为无法通知 NSubstitute 我们不希望它调用基本代码。这就是为什么文档提到不推荐使用部分子

您可以更改基类以返回虚函数的值;然后这个虚函数将被替换。呼叫者没有签名更改。虽然这是一个黑客,但你会得到你需要的

public class SubstitutedClass
{
    public virtual int SubstitutedProperty { get { return InnerValue(); } }
    public virtual int InnerValue() { throw new InvalidOperationException(); }
}

var test2 = Substitute.ForPartsOf<SubstitutedClass>();
test2.When(t => t.InnerValue()).DoNotCallBase();
test2.InnerValue().Returns(10);
于 2014-04-09T11:13:39.767 回答