如何在自定义向导对象

时间:2016-08-16 15:42:37

标签: c# wpf unit-testing mvvm moq

我有一个WPF MVVM应用程序,我需要创建一个自定义向导类型,包含控制各种视图流的对象。向导包含一个私有的类型内部列表,稍后将创建为实际项目,并具有操纵您所在视图的方法。

巫师的工作非常好;现在是时候对它进行单元测试,以确保视图处于适当的顺序。

向导有一个Initialize调用,指定其视图顺序。 NextStep和PreviousStep用于更改您当前所在的视图(它们实际上只是更新索引并引发属性更改事件),而外部对象通过提供视图的CurrentStep属性访问当前视图。它使用StructureMap IContainer来实例化这些视图。

public class WizardExample
{
    private IList<Type> _steps = new List<Type>();
    private int _currentStepIndex = 0;

    public void Initialize()
    {
        _steps.Add(typeof(FirstStepView));
        _steps.Add(typeof(SecondStepView));
        _steps.Add(typeof(ThirdStepView));
    }

    public UserControl CurrentStep
    {
        get
        {
            Type currentStep = _steps[_currentStepIndex];
            return IOCContainer.GetInstance(currentStep) as UserControl;
        }
    }

    public IContainer IOCContainer { get; set; }

    public void NextStep()
    {
        if(_currentStepIndex < _steps.Count - 1)
        {
            ++_currentStepIndex;
        }
    }

    public void PreviousStep()
    {
        if(_currentStepIndex > 0)
        {
            --_currentStepIndex;
        }
    }
}

我想要执行的测试将是这样的(我正在使用Moq和MSTest):

[TestMethod]
public void TestFirstPageType()
{
    Wizard testWizard = new Wizard();
    Mock<FirstStepView> mockFirstStepView = new Mock<FirstStepView>();
    mockFirstStepView.SetupAllProperties();

    Mock<IContainer> mockContainer = new Mock<IContainer>();
    mockContainer.Setup(c => c.GetInstance<FirstStepView>()).Returns(mockFirstStepView.Object);

    testWizard.IOCContainer = mockContainer.Object;
    testWizard.Initialize();

    FirstStepView testView = testWizard.CurrentStep as FirstStepView;
    Assert.IsTrue(testView != null);
}

但是,当我去执行此测试时,我收到以下错误:

  

'System.Reflection.TargetInvocationException:异常已经发生   由调用目标抛出。 ---&GT; System.Expcetion:The   组件'Castle.Proxies.FirstStepViewProxy'没有资源   由URI标识   '/MyDll;component/wizard/views/firststepview.xaml'

知道我做错了吗?

2 个答案:

答案 0 :(得分:0)

从示例中,您的设置

mockContainer.Setup(c => c.GetInstance<FirstStepView>()).Returns(mockFirstStepView.Object);

以及代码中调用的内容

return IOCContainer.GetInstance(currentStep) as UserControl;

是不同的。

您的设置需要与测试中要使用的内容相匹配。

mockContainer.Setup(c => c.GetInstance(typeof(FirstStepView)).Returns(mockFirstStepView.Object);

答案 1 :(得分:0)

我的问题是,当我不需要时,我试图模仿视图。我已将我的测试代码更改为此,现在我的测试运行正常。

[TestMethod]
public void TestFirstPageType()
{
    Wizard testWizard = new Wizard();

    Mock<IContainer> mockContainer = new Mock<IContainer>();
    mockContainer.Setup(c => c.GetInstance<FirstStepView>()).Returns(new FirstStepView());

    testWizard.IOCContainer = mockContainer.Object;
    testWizard.Initialize();

    FirstStepView testView = testWizard.CurrentStep as FirstStepView;
    Assert.IsTrue(testView != null);
}