依赖于Moked属性的属性

本文关键字:属性 Moked 依赖于 | 更新日期: 2023-09-27 18:00:58

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

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

依赖于Moked属性的属性

在您的示例中,您正在创建IFoo接口的mock,因此没有Foo2属性的实现。在这种情况下,Foo对象的实现是不相关的,因为您从未实例化Foo对象。f是IFoo的mock,因此与对象Foo没有任何关系,只是它们都实现了相同的接口。你试过这样的东西吗?

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

不过,我不太确定你想完成什么,所以我猜。

在您的问题中,类Foo内的属性Foo与它所属的类同名,这令人困惑(在C#中也是非法的(。此外,您还缺少属性的类型(可能是string(。所以请拿出一些可编译的代码。

在您完成这些操作之后,我想很明显,您的Mock<>仅指接口IFoo。可能有许多类和结构实现IFoo。Moq怎么知道你在考虑Foo,其中两个属性的getter之间存在连接?

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

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

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

为测试用例生成模拟对象