我有一个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'
知道我做错了吗?
答案 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);
}