C# 为object.GetType().InvokeMember编写单元测试

C# 为object.GetType().InvokeMember编写单元测试,c#,unit-testing,C#,Unit Testing,我有一个使用object.GetType()的方法。InvokeMember(): 以及它的单元测试: [Test] public void should_execute_action() { var executor = CreateExecutor(); Action<int> callback = Substitute.For<Action<int>>(); executor.ExecuteAction("name", "va

我有一个使用object.GetType()的方法。InvokeMember():

以及它的单元测试:

[Test]
public void should_execute_action()
{
    var executor = CreateExecutor();

    Action<int> callback = Substitute.For<Action<int>>();

    executor.ExecuteAction("name", "value", callback);

    callback.Received(1).GetType().InvokeMember(Arg.Is<string>(r => r == "[DispID=0]"), 
        Arg.Is<BindingFlags>(r => r.HasFlag(BindingFlags.Instance) && r.HasFlag(BindingFlags.InvokeMethod)), 
        Arg.Is<Binder>(r => r == null), Arg.Is<object>(r => ReferenceEquals(r, callback)), 
        Arg.Is<Object[]>(r => r == new Object[] { 2 }));
}
[测试]
public void应该执行动作()
{
var executor=CreateExecutor();
Action callback=replacement.For();
ExecuteAction(“名称”、“值”、回调);
callback.Received(1).GetType().InvokeMember(Arg.Is(r=>r==“[DispID=0]”),
Arg.Is(r=>r.HasFlag(BindingFlags.Instance)和&r.HasFlag(BindingFlags.InvokeMethod)),
Arg.Is(r=>r==null),Arg.Is(r=>ReferenceEquals(r,callback)),
参数是(r=>r==新对象[]{2});
}
executor.ExecuteAction内部使用我传递给此方法的“回调”执行invokeCombject。此方法失败,出现“callback.Received(1).GetType().InvokeMember”异常: “System.ArgumentException:必须指定描述所需调用操作的绑定标志(BindingFlags.InvokeMethod CreateInstance GetField SetField GetProperty SetProperty)。”
我怎样才能让这个测试有效?

那么有什么例外吗?@JonSkeet,我更新了问题好的,这稍微有用一点。但我不确定您是否能够拦截
Type.InvokeMember
,基本上。。。我认为你最好拿出一个真正拥有你正在调用的成员的例子,而不是像这样使用模拟。你应该只编写一个纯.net对象,将这个成员作为一个方法(对于奇怪的名称,请参阅Reflection.Emit),然后你可以断言已经传递了正确的参数。
[Test]
public void should_execute_action()
{
    var executor = CreateExecutor();

    Action<int> callback = Substitute.For<Action<int>>();

    executor.ExecuteAction("name", "value", callback);

    callback.Received(1).GetType().InvokeMember(Arg.Is<string>(r => r == "[DispID=0]"), 
        Arg.Is<BindingFlags>(r => r.HasFlag(BindingFlags.Instance) && r.HasFlag(BindingFlags.InvokeMethod)), 
        Arg.Is<Binder>(r => r == null), Arg.Is<object>(r => ReferenceEquals(r, callback)), 
        Arg.Is<Object[]>(r => r == new Object[] { 2 }));
}