如何从另一个模拟继承一个模拟?
假设我有这个示例代码:
interface IBase {
int BaseProperty { get; }
}
interface IDerived : IBase {
int DerivedProperty { get; }
}
并且我喜欢为两个接口编写模拟。
基本模拟很简单:
class BaseMock : Mock<IBase> {
public int BaseProperty { get; set; } = 42;
public BaseMock() {
SetupGet(o => o.BaseProperty).Returns(BaseProperty);
}
}
但我不确定如何正确编写派生模拟:
class DerivedMock : Mock<IDerived> {
public int BaseProperty { get; set; } = 42;
public int DerivedProperty { get; set; } = 73;
public DerivedMock() {
// setups related to IBase
SetupGet(o => o.BaseProperty).Returns(BaseProperty);
// setups related to IDerived
SetupGet(o => o.DerivedProperty).Returns(DerivedProperty);
}
}
此实现将按预期工作,但我被迫在此处复制 BaseMock
类的基本全部内容,而这不是 DRY ...
理想情况下,我想从 BaseMock
继承 DerivedMock
,但是与 IDerived
相关的设置将无法编译(o
是IBase
和我它是IDerived
)...
我很欣赏任何朝着正确方向的努力:)
Say i have this example code:
interface IBase {
int BaseProperty { get; }
}
interface IDerived : IBase {
int DerivedProperty { get; }
}
and i like to write mocks for both interfaces.
Base mock is easy:
class BaseMock : Mock<IBase> {
public int BaseProperty { get; set; } = 42;
public BaseMock() {
SetupGet(o => o.BaseProperty).Returns(BaseProperty);
}
}
but im not sure how to correctly write derived mock:
class DerivedMock : Mock<IDerived> {
public int BaseProperty { get; set; } = 42;
public int DerivedProperty { get; set; } = 73;
public DerivedMock() {
// setups related to IBase
SetupGet(o => o.BaseProperty).Returns(BaseProperty);
// setups related to IDerived
SetupGet(o => o.DerivedProperty).Returns(DerivedProperty);
}
}
this implementation will work as expected, but im forced to copy bassically whole content of BaseMock
class here and that is not DRY ...
ideally i would like to inherit DerivedMock
from BaseMock
, but then setups related to IDerived
would not compile (o
is IBase
and i it to be IDerived
)...
I appreciate any kick in the right direction :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Rafał Rutkowski 把我踢向了正确的方向,我最终为其他感兴趣的人提供了这段代码:
我以这种方式编写它的原因是我可以动态更改属性值并验证它是否被读取/写入。
Rafał Rutkowski kicked me to right direction and i ended up with this code for anyone else interested:
reason why i wrote it this way is that i can dynamicall change property value AND verify that it was readed / written.
您不是从
Mock
类继承的。相反,您可以使用 Mock 的Object
属性来获取模拟对象。要重用设置IBase
模拟,您可以执行以下操作:You don't inherit from the
Mock
class. Instead you use Mock'sObject
property to get the mocked object. To reuse setting upIBase
mock, you can do something like this: