【问题标题】:Property that depends on Mocked property依赖于模拟属性的属性
【发布时间】:2013-02-25 22:44:44
【问题描述】:

我如何模拟和设置一个属性,就像基于该属性的任何其他成员不需要设置一样。

public interface IFoo{
    public Foo  { get; set; }
    public Foo2 { get; }
}

public class Foo :IFoo{
    public Foo  { get; set; }
    public Foo2 { get {return this.Foo +" second";} }
}


public void FooTest(){
    var f = Mock<IFoo>();
    f.SetupGet(x=> x.Foo).Returns("Foo");

    // Should print 'Foo second' although there's no setup for Foo2
    Console.Write(f.Object.Foo2); 
}

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

    在您的示例中,您正在创建 IFoo 接口的模拟,因此没有 Foo2 属性的实现。在这种情况下,Foo 对象的实现是无关紧要的,因为您永远不会实例化 Foo 对象。 f 是 IFoo 的模拟,因此与对象 Foo 没有任何关系,只是它们都实现了相同的接口。你有没有尝试过这样的事情?

    var f = Mock<IFoo>();
    f.SetupGet(x => x.Foo).Returns("Foo");
    f.SetupGet(x => x.Foo2).Returns(f.Foo + "Second");
    

    不过,我不确定您要完成什么,所以我猜。

    【讨论】:

    • 我怀疑他不想为每个定义的成员调用安装程序,但只是一种预感!
    • 啊,所以本质上是一个存根?如果是这样,这是解决该问题的答案:stackoverflow.com/questions/3672463/…
    • 现在如果我有 15 个 Foo2 类似的成员,我必须全部设置
    【解决方案2】:

    在您的问题中,Foo 类中的属性 Foo 与其所属的类具有相同的名称,这令人困惑(并且在 C# 中是非法的)。此外,您还缺少属性的类型(大概是string)。所以请拿出一些可以编译的代码。

    在你完成之后,我想你的Mock&lt;&gt; 只指接口IFoo。可能有许多实现IFoo 的类和结构。 Moq 怎么会知道您在考虑 class Foo,其中两个属性的 getter 之间存在联系?

    IFoo 不能指定两个属性之间的任何所需关系;它是一个接口。

    【讨论】:

      【解决方案3】:

      不完全确定您为什么要这样做,但我的第一个想法是使用反射循环遍历类的成员并设置每个成员,但不确定为什么有人会这样做。我猜你是想节省时间?

      虽然不完全适用,但您可以根据自己的需要进行调整:

      Generating mock objects for test cases

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-16
        • 1970-01-01
        • 2016-07-08
        • 2019-11-30
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        • 1970-01-01
        相关资源
        最近更新 更多