【问题标题】:Member <getter> cannot be accessed with an instance reference; qualify it with a type name instead - Moq无法使用实例引用访问成员 <getter>;改为使用类型名称来限定它 - Moq
【发布时间】:2015-01-31 20:33:15
【问题描述】:

我有单元测试初始化​​:

private App fakeApp;
[TestInitialize]
public void initialize()
{
    Mock<App> mock = new Mock<App>();
    fakeApp = mock.Object;
    mock.Setup(m => m.CommLineInfo.Mode).Returns(RunMode.INSTALL);
}

其中 app 是 WPF 主类:

public partial class App : Application
{
     public static CommandLine CommLineInfo { get; private set; }
}

下划线对象只是:

public class CommandLine
{
    public RunMode Mode
    {
        get { return Something.Mode; }
    }
}

我遇到了主题中的错误。我知道它可能看起来像重复,但我阅读了其他问题并没有找到任何与模拟对象相关的解决方案

编辑:

按照 Hantoun 的建议,我需要制作包装器:

public virtual RunMode RunMode
{
    get
    {
        return App.CommLineInfo.Mode;
    }
}

并在初始化时修改我的代码:

public void initialize()
{
    Mock<AppWrapper> mock = new Mock<AppWrapper>();
    fakeApp = mock.Object;
    mock.Setup(m => m.RunMode).Returns(RunMode.INSTALL);
}

现在它需要修改我正在测试的方法,但至少它可以工作

【问题讨论】:

    标签: c# wpf unit-testing moq


    【解决方案1】:

    尝试静态调用CommLineInfo 属性:

    mock.Setup(m => App.CommLineInfo.Mode).Returns(RunMode.INSTALL);
    

    【讨论】:

    • Invalid setup on a non-virtual (overridable in VB) member: m =&gt; App.CommLineInfo.Mode
    • 我以前从未使用过 Moq,但似乎 Setup 不支持静态方法或属性。在模拟类时,它实际上要求它们是虚拟的或抽象的。不确定您是否看过以下答案,但它可能会帮助您继续:stackoverflow.com/a/2416447/4065807
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多