2017-05-26 56 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