依赖于Mocked属性的属性

时间:2013-02-25 22:44:45

标签: c# unit-testing moq

如何以基于该属性的任何其他成员不需要进行设置的方式模拟和设置一个属性。

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); 
}

3 个答案:

答案 0 :(得分:2)

在您的示例中,您正在创建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");
但是,我不确定你要完成什么,所以我猜。

答案 1 :(得分:2)

在您的问题中,类Foo中的属性Foo与其所属的类具有相同的名称令人困惑(并且在C#中是非法的)。你也错过了属性的类型(大概是string)。所以请提出一些编译的代码。

完成后,我认为您的Mock<>仅指代界面IFoo。可能有许多实现IFoo的类和结构。 Moq怎么会知道你在考虑 class Foo,其中两个属性的getter之间有连接?

IFoo无法指定两个属性之间的任何必需关系;它是一个界面。

答案 2 :(得分:1)

不完全确定你为什么要这样做,但我首先想到的是使用Reflection循环遍历类的成员并设置它们中的每一个,但是,不确定为什么有人会这样做。我猜你在努力节省时间?

虽然不完全适用,但您可以根据需要进行塑造:

Generating mock objects for test cases