2016-11-23 1 views
4

私は、外部モジュールに依存するテストケースがありません。 Rhino Mockを使用して、呼び出された関数に関するレポートを生成したいと考えています。私は成功せず、オンラインで何かを見つけることを試みたRhino Mockを使用して呼び出された関数を報告します

using NUnit.Framework; 
using Rhino.Mocks; 
using System; 

namespace StackOverflow_namespace 
{ 
    public interface IUsefulService 
    { 
     object HiddenAmongManyCalls(); 
    } 

    public class ThirdPartyBase 
    { 
     private int a = 42; 

     public ThirdPartyBase(IUsefulService service) 
     { 
      object liveFastDieYoung = service.HiddenAmongManyCalls(); 
      liveFastDieYoung.Equals(a); 
     } 
    } 

    public class MyParty : ThirdPartyBase 
    { 
     public MyParty(IUsefulService service) : base(service) 
     { 

     } 
    } 


    [TestFixture] 
    class StackOverflow 
    { 
     [Test] 
     public void Hypothetical() 
     { 
      IUsefulService service = MockRepository.GenerateMock<IUsefulService>(); 

      try 
      { 
       var party = new MyParty(service); 
      } 
      catch(Exception e) 
      { 
       string[] calls = MagicallyGetTheCallsThatWereMadeToTheMock(); 
       foreach(var call in calls) 
       { 
        //with my visual studio testrunner for nunit 3 I can investigate stored console output 
        Console.WriteLine(call); 
       } 
       Assert.Fail("Excpexted no exception but was '" + e.GetType().Name + "': " + e.Message); 
      } 
     } 

     private string[] MagicallyGetTheCallsThatWereMadeToTheMock() 
     { 
      return new[] 
      { 
       "This is where I am lost, I do not know how to get the calls from the repository." 
      }; 
     } 
    } 
} 

は、私は私の問題を示して最小限の例を作成しました。

Rhino Mockはすべてのコールを記録しますか?そのリストにアクセスできますか?

編集:

私は期待していなかったの呼び出しを探していますので、動作しませんでした期待を検証しようとする試み。

GetArgumentsForCallsMadeOnを使用して通話のリストを作成できます。私はインターフェイスに反映することができます。私はその方法を始めましたが、私は現在MethodInfoをどのようにAction<T>に変換することができないのか分かりません。

private IEnumerable<string> GetCallsList<Interface>(Interface rhinomock) 
{ 
    Type interfaceType = typeof(Interface); 
    List<MethodInfo> interfaceMethodInfos = new List<MethodInfo>(); 
    List<string> returnInfos = new List<string>(); 
    StringBuilder callbuilder = new StringBuilder(); 

    foreach (var property in interfaceType.GetProperties()) 
    { 
     interfaceMethodInfos.Add(property.GetGetMethod()); 
     interfaceMethodInfos.Add(property.GetSetMethod()); 
    } 
    foreach (var method in interfaceType.GetMethods()) 
    { 
     interfaceMethodInfos.Add(method); 
    } 

    foreach (var methodinfo in interfaceMethodInfos) 
    { 
     Action<Interface> magic = null; //convert methodinfo into action - still missing 
     var calls = rhinomock.GetArgumentsForCallsMadeOn(magic); //magic is currently null, here be crash 
     foreach (var call in calls) 
     { 
      bool more = false; 
      callbuilder.Clear().Append(interfaceType.Name).Append('.').Append(methodinfo.Name).Append('('); 
      foreach (var parameter in call) 
      { 
       if (more){ callbuilder.Append(", "); } 
       if (null == parameter) { callbuilder.Append("<null>"); } 
       else { callbuilder.Append(parameter.ToString()); } 
       more = true; 
      } 
      callbuilder.Append(')'); 
      string callInfo = callbuilder.ToString(); 
      returnInfos.Add(callInfo); 
     } 
    } 
    return returnInfos; 
} 
+0

はいrhinomocksはすべてのメソッド呼び出しを記録します。 AssertWasCalledを使用して実行を確認できます。 –

+0

@OldFox私は何が起こったのかを示すレポートを作成したいと思っています。私はVerifyAllExpectationsが私のためにそれをするとは思わない。 – Johannes

+2

UTでは、予想される動作を確認する必要があります。すべての呼び出しを偵察するのは悪い習慣です。 'VerifyAllExpectations'はあなたの問題を解決しません。予期せぬ呼び出しを許可したくない場合は、Strict mockを使用する必要があります(今日、この種の模擬方法を使用するのは悪い習慣です...)。レコードにアクセスしたい場合は、reflactionを使うかrhinomocksのソースコードをダウンロードして変更を加えてください。 –

答えて

2

私は欲しかった出力を得るために反射を使用することができました。 テストが失敗し、出力にすべてのメソッド呼び出しが含まれている最小限の例を次に示します。

using NUnit.Framework; 
using Rhino.Mocks; 
using System; 
using System.Collections.Generic; 
using System.Reflection; 
using System.Text; 

namespace StackOverflow_namespace 
{ 
    public interface IUsefulService 
    { 
     object HiddenAmongManyCalls(); 
     string TestCall2(string arg1, int arg2); 
     string FULLACCESS { get; set; } 
     string READONLY { get; } 
    } 

    public class ThirdPartyBase 
    { 
     private int a = 42; 

     public ThirdPartyBase(IUsefulService service) 
     { 
      service.TestCall2("callA", 1); 
      service.TestCall2("callB", 1); 
      object liveFastDieYoung = service.HiddenAmongManyCalls(); 
      service.TestCall2("callA", 2); 
      service.TestCall2("callB", 2); 
      var a = service.FULLACCESS; 
      var b = service.READONLY; 
      service.FULLACCESS = "some"; 
      liveFastDieYoung.Equals(a); 
     } 
    } 

    public class MyParty : ThirdPartyBase 
    { 
     public MyParty(IUsefulService service) : base(service) 
     { 

     } 
    } 


    [TestFixture] 
    class StackOverflow 
    { 
     [Test] 
     public void Hypothetical() 
     { 
      IUsefulService service = MockRepository.GenerateMock<IUsefulService>(); 

      try 
      { 
       var party = new MyParty(service); 
      } 
      catch (Exception e) 
      { 
       var calls = GetCallsList(service); 
       foreach (var call in calls) 
       { 
        //with my visual studio testrunner for nunit 3 I can investigate stored console output 
        Console.WriteLine(call); 
       } 
       Assert.Fail("Excpexted no exception but was '" + e.GetType().Name + "': " + e.Message); 
      } 
     } 

     private IEnumerable<string> GetCallsList<Interface>(Interface rhinomock) 
     { 
      Type interfaceType = typeof(Interface); 
      List<MethodInfo> interfaceMethodInfos = new List<MethodInfo>(); 
      List<string> returnInfos = new List<string>(); 
      StringBuilder callbuilder = new StringBuilder(); 

      foreach (var property in interfaceType.GetProperties()) 
      { 
       AddMethodInfoIfValid(interfaceMethodInfos, property.GetGetMethod()); 
       AddMethodInfoIfValid(interfaceMethodInfos, property.GetSetMethod()); 
      } 
      foreach (var method in interfaceType.GetMethods()) 
      { 
       AddMethodInfoIfValid(interfaceMethodInfos, method); 
      } 

      foreach (var methodinfo in interfaceMethodInfos) 
      { 
       int paramcount = methodinfo.GetParameters().Length; 
       object[] args = new object[paramcount]; 
       Action<Interface> lambdacall = (i) => methodinfo.Invoke(i, args); 
       var calls = rhinomock.GetArgumentsForCallsMadeOn(lambdacall); 
       foreach (var call in calls) 
       { 
        bool more = false; 
        callbuilder.Clear().Append(interfaceType.Name).Append('.').Append(methodinfo.Name).Append('('); 
        foreach (var parameter in call) 
        { 
         if (more) { callbuilder.Append(", "); } 
         if (null == parameter) { callbuilder.Append("<null>"); } 
         else { 
          callbuilder 
           .Append('(').Append(parameter.GetType().Name).Append(")'") 
           .Append(parameter.ToString()).Append("'"); 
         } 
         more = true; 
        } 
        callbuilder.Append(')'); 
        string callInfo = callbuilder.ToString(); 
        returnInfos.Add(callInfo); 
       } 
      } 
      return returnInfos; 
     } 

     private static void AddMethodInfoIfValid(List<MethodInfo> interfaceMethodInfos, MethodInfo methodinfo) 
     { 
      if (null != methodinfo) 
      { 
       interfaceMethodInfos.Add(methodinfo); 
      } 
     } 
    } 
} 
関連する問題