1

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

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

3 回答 3

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

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

于 2013-02-25T22:56:24.987 回答
2

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

完成此操作后,我认为您Mock<>仅指的是 interface IFoo。可能有许多类和结构实现IFoo. Moq 怎么会知道你在考虑两个属性的 getter 之间存在联系的类? Foo

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

于 2013-02-25T23:33:49.623 回答
1

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

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

为测试用例生成模拟对象

于 2013-02-25T22:50:55.027 回答