依赖于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);
}
在您的示例中,您正在创建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在类的成员中循环并设置每个成员,尽管不确定为什么有人会这样做。我猜你是想节省时间吧?
虽然不完全适用,但您可以根据自己的需求进行建模,因为它是相关的:
为测试用例生成模拟对象