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;
}
はいrhinomocksはすべてのメソッド呼び出しを記録します。 AssertWasCalledを使用して実行を確認できます。 –
@OldFox私は何が起こったのかを示すレポートを作成したいと思っています。私はVerifyAllExpectationsが私のためにそれをするとは思わない。 – Johannes
UTでは、予想される動作を確認する必要があります。すべての呼び出しを偵察するのは悪い習慣です。 'VerifyAllExpectations'はあなたの問題を解決しません。予期せぬ呼び出しを許可したくない場合は、Strict mockを使用する必要があります(今日、この種の模擬方法を使用するのは悪い習慣です...)。レコードにアクセスしたい場合は、reflactionを使うかrhinomocksのソースコードをダウンロードして変更を加えてください。 –