如何在C#中模拟类成员?
我试图使用FakeiTasy来模拟一个对象,该对象是我正在创建的C#类的成员 Fakeitesy文档表明您以类似以下方式伪造对象:如何在C#中模拟类成员?,c#,mocking,var,fakeiteasy,C#,Mocking,Var,Fakeiteasy,我试图使用FakeiTasy来模拟一个对象,该对象是我正在创建的C#类的成员 Fakeitesy文档表明您以类似以下方式伪造对象: private static var m_physics = A.Fake<IPhysics>(); private static var m_physics=A.Fake(); 也就是说,使用“var”关键字 然而,在这种情况下,C#编译器不喜欢在非本地上下文中使用var。我得到这个错误: 上下文关键字“var”只能出现在局部变量声明中 我不能模拟
private static var m_physics = A.Fake<IPhysics>();
private static var m_physics=A.Fake();
也就是说,使用“var”关键字
然而,在这种情况下,C#编译器不喜欢在非本地上下文中使用var。我得到这个错误:
上下文关键字“var”只能出现在局部变量声明中
我不能模拟非本地对象吗?您只能在本地上下文(如功能块)中使用'var'关键字。不能将类成员声明为“var”。只能在本地上下文(如功能块)中使用“var”关键字。您不能将类成员声明为“var”。我认为您忽略了mock/stub的要点。模拟和存根用于测试,当您不希望测试对象通过或失败时,取决于它所依赖的其他组件。因此,您要做的是将这些依赖项的显式实现交换为您可以在测试中完全控制的这些依赖项的mock/stub
class Foo {
public Foo(IBar bar) { }
public object M() { // do something with IBar }
}
这里的Foo
依赖于IBar
。我们想测试Foo.M
。我们不希望测试通过或失败取决于我们给IBar
的Foo
的具体实现是否工作
[Fact]
public void MDoesWhatItIsSupposeToDo() {
var foo = new Foo(new Bar());
object expected = // expected result
Assert.Equal(expected, foo.M());
}
如果Bar
被破坏,即使Foo
的编码可能完全正确,该测试也可能失败。因此,您可以在模拟/存根中加入子项以防止出现这种情况
[Fact]
public void MDoesWhatItIsSupposeToDo() {
var bar = A.Fake<IBar>();
// set up bar to do what is expected of IBars
var foo = new Foo(bar);
object expected = // expected result
Assert.Equal(expected, foo.M());
}
然后:
var physics=A.Fake();
var whatever=新的whatever(物理学);
我认为你没有抓住模拟/存根的要点。模拟和存根用于测试,当您不希望测试对象通过或失败时,取决于它所依赖的其他组件。因此,您要做的是将这些依赖项的显式实现交换为您可以在测试中完全控制的这些依赖项的mock/stub
class Foo {
public Foo(IBar bar) { }
public object M() { // do something with IBar }
}
这里的Foo
依赖于IBar
。我们想测试Foo.M
。我们不希望测试通过或失败取决于我们给IBar
的Foo
的具体实现是否工作
[Fact]
public void MDoesWhatItIsSupposeToDo() {
var foo = new Foo(new Bar());
object expected = // expected result
Assert.Equal(expected, foo.M());
}
如果Bar
被破坏,即使Foo
的编码可能完全正确,该测试也可能失败。因此,您可以在模拟/存根中加入子项以防止出现这种情况
[Fact]
public void MDoesWhatItIsSupposeToDo() {
var bar = A.Fake<IBar>();
// set up bar to do what is expected of IBars
var foo = new Foo(bar);
object expected = // expected result
Assert.Equal(expected, foo.M());
}
然后:
var physics=A.Fake();
var whatever=新的whatever(物理学);
我认为你把模仿和隐式键入混为一谈了。如果将var
更改为返回的实际类型,则不会有问题。模拟类成员太不好了……该类型还不存在。因此,对mock的需要。返回类型不是IPhysics吗?因此,与其使用'var',不如使用IPhysics作为m_physics的类型?@_rusty:虽然这是正确的,但它忽略了注入依赖项和mock的意义。我认为你把mock与隐式类型混淆了。如果将var
更改为返回的实际类型,则不会有问题。模拟类成员太不好了……该类型还不存在。因此,对mock的需要。返回类型不是IPhysics吗,所以与其使用'var',不如使用IPhysics作为m_physics的类型?@_rusty:虽然这是正确的,但它忽略了注入依赖项和mock的意义。对。这就是错误消息所说的。这就引出了一个问题,即在这种限制下,如何使用mocking框架。这就是错误消息所说的。这就引出了一个问题,在这个限制下,如何使用mocking框架。好的,这是一个很好的总结。谢谢与其说我忽略了mock的要点,不如说我想使用一种现有的机制(mock)来编译类A,当A包含B的实例,而B还没有实现时。你上面提到的最后一点似乎给了我一种方法。@Buggieboy:但这就是为什么你用接口(IPhysics
)而不是具体的实现来编写代码的原因。这个问题与嘲弄无关。是的,我现在明白了。使用模拟框架对我所做的工作来说是过分的。简单的旧接口就足够了。好的,这是一个很好的总结。谢谢与其说我忽略了mock的要点,不如说我想使用一种现有的机制(mock)来编译类A,当A包含B的实例,而B还没有实现时。你上面提到的最后一点似乎给了我一种方法。@Buggieboy:但这就是为什么你用接口(IPhysics
)而不是具体的实现来编写代码的原因。这个问题与嘲弄无关。是的,我现在明白了。使用模拟框架对我所做的工作来说是过分的。简单的旧接口就足够了。