5

Autofac を使用してカスタム ビュー モデル ロケーターを作成し、それらのほとんどが通常使用されるように、App.xaml を介して通常どおりに設定しました。私の問題は、今ユニットをテストするにはどうすればよいですか? ビューを初期化するメソッドをテストしようとするたびにエラーが発生します

私のapp.xamlでは:

<desktop:ViewModelLocator xmlns:local="clr-namespace:MyProject.Desktop" x:Key="ViewModelLocator" />

各ビューで:

DataContext="{Binding MyFirstViewModel, Source={StaticResource ViewModelLocator}}"

単体テスト エラー:

{"Cannot find resource named 'ViewModelLocator'. Resource names are case sensitive."}

単体テストを実行すると、実際のアプリのインスタンスが実際に存在しない理由がわかりました。この問題を回避する良い方法は何ですか?

ViewModelLocator コード:

/// <summary>
/// Autofac object container
/// </summary>
private readonly IContainer objectContainer;

#region Constructor

/// <summary>
/// Constructor for view model locator
/// </summary>
public ViewModelLocator()
{
    objectContainer = App.ObjectContainer;
    //objectContainer.BeginLifetimeScope();
}

#endregion

#region Properties

/// <summary>
/// Gets the resolved instance of a main window view model
/// </summary>
public MainWindowViewModel MainWindowViewModel
{
    get
    {
        return objectContainer.Resolve<MainWindowViewModel>();
    }
}

public FirstViewModel MyFirstViewModel 
{
    get
    {
        return objectContainer.Resolve<FirstViewModel>();
    }
}

public SecondViewModel MySecondViewModel 
{
    get
    {
        return objectContainer.Resolve<SecondViewModel>();
    }
}
4

1 に答える 1

1

これは少し遅れていますが、役に立つかもしれません。コンストラクターで objectContainer を解決する代わりに、プロパティを使用して解決します。

//note this is a lazy getter, i.e. will be resolved when needed on the first call
private IContainer ObjectContainer
{
   get
   {
       if(objectContainer == null)
           objectContainer = App.ObjectContainer;
       return objectContainer:
   }
}

次に、フィールドではなく、コードでプロパティを使用します。また、プロパティの使用を通じて強制したいフィールドを他の誰かが使用していることを懸念している場合は、IntelliSence で簡単に認識できない名前に名前を変更します (たとえば、zREgdnlksfObjectContainer :)) プロパティは非公開であることに注意してください。何も変わらない。プロパティを internal にして、lib を単体テストに表示されるようにマークすることができます。これにより、単体テストでそれをモックしてWhenCalled()IContainer を返す/解決することができます。

于 2015-05-18T15:01:40.593 に答える