单元测试:从嵌套类型引发事件

时间:2018-01-31 16:59:27

标签: c# unit-testing justmock

我有一个接口,它在另一个接口上有一个属性,

public interface IInnerInterface
{
    event EventHandler OnCompleted;
}

public class InnerClassImplementation : IInnerInterface
{
    public event EventHandler OnCompleted;

    private void CompletedState()
    {
        OnCompleted?.Invoke(this, new EventArgs());
    }
}

public interface IOuterInterface
{
    IInnerInterface InnerInterface { get; }
}

public class Main : IOuterInterface
{
    public IInnerInterface InnerInterface { get; }

    public bool IsOperationComplete { get; set; }

    public Main(IInnerInterface innerInterface)
    {
        InnerInterface = innerInterface;
        InnerInterface.OnCompleted += InnerInterface_OnCompleted;
    }

    private void InnerInterface_OnCompleted(object sender, EventArgs e)
    {
        IsOperationComplete = true;
    }
}

我正在尝试测试Main类。其中一个测试用例是验证事件的Handler方法。

我尝试了以下代码实现来测试,

[TestClass]
public class MainTest
{
    private Mock<IInnerInterface> _innerInterfaceMock;
    private Main _main;

    [TestInitialize]
    public void Initialize()
    {
        _innerInterfaceMock = new Mock<IInnerInterface>();
        _main = new Main(_innerInterfaceMock.Object);
    }

    [TestMethod]
    public void OnCompleted_ShouldDoSomething()
    {
        //Act
        _main.Raise(m=>m.InnerInterface.OnCompleted+=null, new EventArgs());

        //Assert
        _main.IsOperationComplete.Should().BeTrue();

    }
}

我收到以下错误,

  

测试方法   Samples.MainTest.OnCompleted_ShouldDoSomething   引发异常:Telerik.JustMock.Core.MockException:无法执行   推导出在参数中指定了哪个事件。       在Telerik.JustMock.Core.Behaviors.RaiseEventBehavior.RaiseEventImpl(Object   例如,EventInfo evt,Object [] args)at   Telerik.JustMock.Core.ProfilerInterceptor.GuardInternal(动作   guardedAction)at   Samples.MainTest.OnCompleted_ShouldDoSomething()

不知道我做错了什么?

1 个答案:

答案 0 :(得分:3)

你不应该从REPL(主要)提升事件,直接从IInnerInterface模拟中提出:

moq

BTW此代码(基于您的代码)使用justmock而非justmock,但您的例外与{{1}}相关,我认为使用这两种方法会导致方法和重载混淆,只需选择一个并坚持下去。