2017-05-26 57 views
2

我有我的视图模型中的代码如下。Moq Application.Current.MainWindow C#

private Generate() 
{ 

// Some code here 
var window = new CreateWindow 
       { 
        Owner = Application.Current.MainWindow 

       }; 
} 

我想在我的单元测试中模拟MainWindow对象。我试过

var app = new Application() 
    mock.SetupGet(x => x._mainWindow) 
       .Returns(It.IsAny<MainWindow>()); 

但MainWindow对象始终为空。

任何人都可以提供一些有用的指针在这个问题上。

回答

0

您应该将new CreateWindow行换行为Factory模式。

创建一个新的WindowFactory类,它具有单个方法和相应的接口IWindowFactory。

然后在你的Generate方法中调用注入的WindowFactory.Create()方法。

在你测试中注入一个模拟的IWindowFactory,它返回一个假窗口。

public interface IWindowFactory 
{ 
    CreateWindow Create(); 
} 

public class WindowFactory : IWindowFactory 
{ 
    public CreateWindow Create() 
    { 
    return new CreateWindow { Owner = Application.Current.MainWindow }; 
    } 
} 

在您的视图模型在您的测试添加属性

public IWindowFactory WindowFactory { get; set; } 

在您的生成方法

var window = WindowFactory.Create(); 

然后,当您创建视图模型,该WindowFactory设置为模拟

+0

谢谢我帮忙嘲笑代码。这两个解决方案工作 – user2459838

1

您可以创建一个IMainWindowProvider接口和MainWindowProvider实现:

public interface IMainWindowProvider 
{ 
    Window GetMainWindow(); 
} 

public class MainWindowProvider : IMainWindowProvider 
{ 
    public Window GetMainWindow() => Application.Current.MainWindow; 
} 

然后在你当前创建您可以使用此服务的实例方法的代码(该实例可以在你想测试你的容器类的构造函数设置,并在应用这将是一个MainWindowProvider类的实例,例如依赖注入):

var window = new CreateWindow 
{ 
    Owner = mainWindowProvider.GetMainWindow() 
}; 

而且在单元测试中,你可以嘲笑IMainWindowProvider而不是试图模拟应用程序,设置模拟返回一个空的新窗口,而不是。

+0

谢谢我帮忙嘲笑代码。两个解决方案都有效 – user2459838