如何模拟我的主Winform表单的实例来测试一些方法?

时间:2010-12-20 20:12:34

标签: c# winforms

我正在使用Moq(我和TDD期间一样非常新)。我想要Moq我的主要Winforms表单的实例,所以我可以在那里测试一些方法。这可能吗?它的构造函数接受Assembly()的对象。

我正在尝试以下尝试失败:

var mockMainForm = new Mock<MainForm>();
mockMainForm.Setup(x => x.Assembler).Returns(new Assembly());
return mockMainForm.Object;

但是一旦返回,我就无法访问该对象的任何属性或方法。这可能吗?

但我收到错误(失败:System.ArgumentException:Expression不是方法调用:x =&gt; x.Assembler     在Moq.ExpressionExtensions.ToMethodCall(LambdaExpression表达式))

2 个答案:

答案 0 :(得分:2)

使用Moq进行模拟只会模拟类的接口和虚方法。 Assembler属性需要定义为virtual

在任何情况下,模拟Windows窗体都不是一个好的嘲弄 - 它有一大包WIN32的东西,使你的测试变得脆弱。如果需要单元测试并模拟表单,请创建表单需要实现的接口,并模拟需要与表单交互的对象。

public interface IHasAssembler
{
    Foo Assembler {get; set;}
}

public class MyForm : IHasAssembler
{
     //
}

然后模拟界面而不是表单:

Mock<IHasAssembler> myMock = new Mock<IHasAssembler>();

答案 1 :(得分:0)

我从未使用(或者确实听说过)Moq,但我猜测mockMainForm.Object类型为Form,并且您可以投射以获取它:< / p>

object moqObject = MakeMoqOfMyMainForm();
Form mainForm = (Form)moqObject;

(如果我错了,请告诉我,我会删除此答案)