首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NUnit / Moq在变量的构造函数上抛出NullReferenceException错误

NUnit / Moq在变量的构造函数上抛出NullReferenceException错误
EN

Stack Overflow用户
提问于 2011-10-05 12:46:48
回答 1查看 1.3K关注 0票数 0

我使用的是Moq,NUnit,WPF,MVVM,Ninject。

我正在为我的LoginViewModel编写一个测试,在测试中,当我使用LoginViewModel的构造函数创建一个新实例时,我得到了一个NullReferenceException错误。代码编译并运行(即,当我运行LoginView显示的程序,并与LoginViewModel一起创建正确的行为等等),但由于某种原因,UnitTest正在崩溃。

这是构造函数:

代码语言:javascript
运行
复制
public LoginViewModel(ILoginServices loginServices,IDialogService dialogServices)
{
            InitializeFields();
            _loginServices = loginServices;
            _dialogService = dialogServices;
            DomainList = _loginServices.GetDomainListing();

}

我对依赖项进行了如下模拟:

代码语言:javascript
运行
复制
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>();
  • 我还尝试插入真正的服务作为参数。
  • 我已经验证了模拟是否工作,并且这些模拟返回的对象不是空的。
  • 我已经注释掉了构造函数中的所有代码。
  • 我试过插入线路 LoginViewModel检验=新LoginViewModel(_fakeLoginService,_fakeDialogService); 在对构造函数的调用之前(查看它是否与原来的局部变量被释放或之前有什么关系),这一行反而崩溃了。

我可以看到,这一定是构造函数(但不是我在其中编写的代码),这与NUnit / Moq完全相关,因为我的代码仍然编译和运行良好。

我不知道这家伙,谁能给我指明正确的方向?

编辑

好的,我已经运行了代码,错误来自于这一行代码:

代码语言:javascript
运行
复制
ImageSource = (ImageSource)Application.Current.FindResource(_imageName);

这段代码将转到ImageDictionary,并获得对WindowViewModel中撤消按钮(WindowViewModel继承的)图像的引用。

关于为什么它在应用程序的正常运行中工作,而不是在测试中工作,我的假设是:

1),因为我通过NUnit运行程序代码,所以Application.Current对象没有得到分配的属性/没有Application.Current对象。

代码语言:javascript
运行
复制
                                  **or**

2)与这样一个事实有关:由于程序代码是在NUnit中运行的,所以代码无法访问/无法解析ImageDictionary来查找映像。

我更倾向于第一种假设,但到目前为止我还不能百分之百确定,而且我在运行时很难找到Application.Current的值,因为当我将光标移到代码上时,通常会出现显示未出现对象的细节的工具提示。

我的新问题是:这些都有意义吗?你们知道在通过Application.Current运行测试项目时是否存在/可以访问NUnit对象吗?

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-05 15:24:32

你是对的。对于单元测试,Application.Current为空。您可以通过注射应用对象来解决这个问题,因为在代码中引用单个对象会使生活变得很棘手。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7661502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档