我使用的是Moq,NUnit,WPF,MVVM,Ninject。
我正在为我的LoginViewModel编写一个测试,在测试中,当我使用LoginViewModel的构造函数创建一个新实例时,我得到了一个NullReferenceException错误。代码编译并运行(即,当我运行LoginView显示的程序,并与LoginViewModel一起创建正确的行为等等),但由于某种原因,UnitTest正在崩溃。
这是构造函数:
public LoginViewModel(ILoginServices loginServices,IDialogService dialogServices)
{
InitializeFields();
_loginServices = loginServices;
_dialogService = dialogServices;
DomainList = _loginServices.GetDomainListing();
}我对依赖项进行了如下模拟:
Mock<ILoginServices> moq = new Mock<ILoginServices>();
moq.Setup(log =>
log.LoginUser(It.IsAny<string>(),
It.IsAny<string>(),
It.IsAny<string>()))
.Callback<string, string, string>((i, j, k) => CheckArgs(i, j, k));
moq.Setup(log2 =>
log2.GetDomainListing()).Returns(new List<string> { "Domain" });
Mock<IDialogService> moq2 = new Mock<IDialogService>();我可以看到,这一定是构造函数(但不是我在其中编写的代码),这与NUnit / Moq完全相关,因为我的代码仍然编译和运行良好。
我不知道这家伙,谁能给我指明正确的方向?
编辑
好的,我已经运行了代码,错误来自于这一行代码:
ImageSource = (ImageSource)Application.Current.FindResource(_imageName);这段代码将转到ImageDictionary,并获得对WindowViewModel中撤消按钮(WindowViewModel继承的)图像的引用。
关于为什么它在应用程序的正常运行中工作,而不是在测试中工作,我的假设是:
1),因为我通过NUnit运行程序代码,所以Application.Current对象没有得到分配的属性/没有Application.Current对象。
**or**2)与这样一个事实有关:由于程序代码是在NUnit中运行的,所以代码无法访问/无法解析ImageDictionary来查找映像。
我更倾向于第一种假设,但到目前为止我还不能百分之百确定,而且我在运行时很难找到Application.Current的值,因为当我将光标移到代码上时,通常会出现显示未出现对象的细节的工具提示。
我的新问题是:这些都有意义吗?你们知道在通过Application.Current运行测试项目时是否存在/可以访问NUnit对象吗?
任何帮助都将不胜感激。
发布于 2011-10-05 15:24:32
你是对的。对于单元测试,Application.Current为空。您可以通过注射应用对象来解决这个问题,因为在代码中引用单个对象会使生活变得很棘手。
https://stackoverflow.com/questions/7661502
复制相似问题