2016-05-23 17 views
2

CasOperations.GetImpairedNodesFromCASpectrumAsync()メソッドを模擬して、模擬値を返すことはできますか?現在、例外が発生しています(コード例の下に表示されています)。Moq - クラスプロパティのメソッドを返すことができません。戻り値

クラスとプロパティを嘲笑する:

public class BranchCircuitStatusScheduleEntry : NWatchCustomScheduleEntryBase, INWatchCustomScheduleEntry 
{ 
    public BranchCircuitStatusScheduleEntry(INWatchSchedulerApplication application) 
     : base(application, DevOpsScheduleFrequency.Minute, 15, 0, DevOpsScheduleFlags.Always) 
    { 
     // Some initialization for below properties 
     CasOperations = new CasOperations(cas, EntityService, IsBranchesOnly); 
    } 

    public CasOperations CasOperations { get; private set; } 

} 

public class CasOperations 
{ 
    public CasOperations(CasApi casApi, BranchCircuitEntityService entityService, bool isBranchesOnly) 
    { 
     CAS = casApi; 
     this.entityService = entityService; 
     this.isBranchesOnly = isBranchesOnly; 
    } 
} 

テストモックを実行しようとします:

[TestMethod] 
public void DownNodeRediscoveredInSpectrum() 
{ 
    var mock = new Mock<BranchCircuitStatusScheduleEntry>(_application); 
    mock.CallBase = true; 

    // Spectrum's artificial response with a model with the same name, but a "new" model handle 
    var mockedNewlyImpairedNodes = new NetworkDeviceNodeStatus[] 
    { 
     new NetworkDeviceNodeStatus 
     { 
      // Not important 
     } 
    }; 

    mock.Setup(x => 
     x.CasOperations.GetImpairedNodesFromCASpectrumAsync()).ReturnsAsync(mockedNewlyImpairedNodes); 
} 

例外でスロー

私は次のセットアップを持っていますテスト:

タイプ 「Castle.DynamicProxy.InvalidProxyConstructorArgumentsException」 の例外がMoq.dllで発生したが、ユーザーコードの追加 情報で処理されませんでした: NWatch.NetworkCircuits.CasOperations:クラスのプロキシをインスタンス化することはできません。パラメータなしの コンストラクタが見つかりませんでした。あなたがBranchCircuitStatusScheduleEntryの動作を模擬しようとしていないモックの設定で

が、CasOperationsクラスの振る舞い:

+2

これでメソッドを呼び出すには、確かに 'CasOperations'のインスタンスが必要です。おそらく、代わりに 'ICasOperations'を作るべきでしょう。これは模擬オブジェクトを簡単に挿入することができます。 – Jonesopolis

+0

しかし、模擬されたBranchCircuitStatusScheduleEntryには既にインスタンスがあります。私はMoqにそのメソッドの1つをオーバーライドさせて、私が望む値を返すことができればと思っていました。 – blgrnboy

答えて

4

することは、私はそれを試してみることを許可します。したがって、実際にはMock<CasOperations>オブジェクトが必要です。またはさらに良いことに、@ Jonesopolisが彼のコメントで言ったようにMock<ICasOperations>

さらに、BranchCircuitStatusScheduleEntryコンストラクタでは、そのクラスのインスタンスとCasOperationsのインスタンスの両方を初期化しています。 BranchCircuitStatusScheduleEntryコンストラクタの外側でCasOperationsのインスタンスを初期化し、それをパラメータとして渡す方が良いでしょう。

だから、それはこのようになります:

public class BranchCircuitStatusScheduleEntry : NWatchCustomScheduleEntryBase, INWatchCustomScheduleEntry 
{ 
    public BranchCircuitStatusScheduleEntry(INWatchSchedulerApplication application, ICasOperations casOperations) 
     : base(application, DevOpsScheduleFrequency.Minute, 15, 0, DevOpsScheduleFlags.Always) 
    { 
     CasOperations = casoperations; 
    } 

    public CasOperations CasOperations { get; private set; } 
} 

最後に、あなたのモックを作成し、それを設定し、BranchCircuitStatusScheduleEntryコンストラクタにパラメータとして渡す:

var casMock = new Mock<ICasOperations>(); 
casMock.Setup(x => x.GetImpairedNodesFromCASpectrumAsync()).ReturnsAsync(mockedNewlyImpairedNodes); 

var mock = new Mock<BranchCircuitStatusScheduleEntry>(_application, casMock.Object); 
mock.CallBase = true; 

注多分、このことBranchCircuitStatusScheduleEntryの最後のインスタンスはモックではなく、実際のオブジェクト(テスト対象のインスタンス)であるべきです。

+0

ありがとうカルロス!あなたはCasOperationsが嘲笑されたアイテムである必要があることは絶対に正しいです。残念ながら、このクラスをインスタンス化して呼び出されるスケジューラーは、そのパラメーターを指定するだけであるため、これをパラメーターとして受け入れることはできません。 – blgrnboy

関連する問題