【问题标题】:c# vs 2017 mocking var property with return insidec# vs 2017 mocking var property with return inside
【发布时间】:2019-06-14 19:37:18
【问题描述】:

我正在尝试在一个只读的类中模拟一个自定义变量,并且在 get 中有一个返回。

public class BaseController
{
    public string Local
    {
        return GlobalVariable.Local
    }
}

[TestMethod]
public void TestMethod()
{
    var baseControllerMock = Substitute.For<BaseController>();
    baseControllerMock.Local.Returns("local");
}

我的问题是,即使我在返回内部使用 ReturnsForAnyArgs 时,我也厌倦了寻找全局变量并且它中断了,因为

System.NullReferenceException: '对象引用未设置为对象的实例。'因为 GlobalVariable 为空。

我还尝试模拟全局变量

[TestMethod]
public void TestMethod()
{
    var baseControllerMock = Substitute.For<BaseController>();
    var globalVarMock = Substitute.For<GlobalVariable>();
    globalVarMock.Local.returns("local");
    baseControllerMock.Local.Returns("local");
}

但是当它返回时它说它仍然是空的。

【问题讨论】:

    标签: c# properties mocking nsubstitute


    【解决方案1】:

    尝试制作BaseController.Localevirtual

    NSubstitute 只能与 overridable members of classes 一起使用。如果您将NSubstitute.Analyzers 添加到您的测试项目中,它将有助于检测在编译时无法替换的情况。


    从 cmets 编辑: 这个测试对我来说没有错误地通过:

        public static class GlobalVariable { public static string Local = "hi"; }
        public class BaseController
        {
            public virtual string Local { get { return GlobalVariable.Local; } }
        }
        [TestMethod]
        public void TestMethod() {
            var baseControllerMock = Substitute.For<BaseController>();
            baseControllerMock.Local.Returns("local");
        }
    

    【讨论】:

    • public class BaseController { public virtual string Local { return GlobalVariable.Local } } 像这样?我没用过虚拟部分
    • @RicardoSanchezSantos 从你的例子中我不确定你是否在寻找一个领域或财产?对于具有public virtual string Local { get { return GlobalVariable.Local; } } 的属性将通过您的第一个测试(尽管需要在测试中将Locale 更改为Local 以使其编译)。
    • 语言环境部分是一个错字,我的错,我已经编辑了它,所以它说它应该是本地的,而且你已经添加了虚拟部分public virtual string Local { get { return GlobalVariable.Local; } },我再次运行了测试,但是它当它进入返回时仍然向我发送 NullReference
    • 嗨@RicardoSanchezSantos,我已经用我的机器上传递的示例更新了答案。 (虽然我使用了[Fact] 而不是[TestMethod],因为我在我的实验项目中安装了 XUnit 而不是 MSTest :))
    • 我也非常推荐将NSubstitute.Analyzers 添加到您的测试项目中。如果某些内容无法替换(例如,因为它是非虚拟类成员),它将在编译时通知您。
    猜你喜欢
    • 2013-03-26
    • 2019-01-11
    • 2011-02-14
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    相关资源
    最近更新 更多