JustMock和大型测试运行的问题

时间:2011-06-06 14:38:08

标签: c# unit-testing mocking private-methods justmock

好的,我对JustMock有一个问题,我希望有人可以帮助我。 我有一个有几种测试方法的类(类似于80)。独立运行时,这些方法中的每一种都会以漂亮的颜色传递。但是我有一些方法,当作为更大的测试运行(比如整个类)的一部分运行时将失败。

这些测试方法使用JustMock模拟框架模拟非公共方法,然后调用调用每个私有方法的公共接口方法。 以下是一个例子

 ///<summary>
///  A test for CheckCommError
///</summary>
[TestMethod]
public void CheckCommErrorWithErrorTest()
{
    var message = new byte[] { (byte)EagleMessageTypes.SendCommError,BitConverter.GetBytes((ushort)10)[0], BitConverter.GetBytes((ushort)10)[1] };

    bool expected = false; // TODO: Initialize to an appropriate value
    bool actual;
    //mock the other members in EagleUtility that are being used...
    var target = new EagleUtility();
    bool called = true;
    Mock.NonPublic.Arrange<bool>(target, "CheckMinimumSize", ArgExpr.IsAny<BasicEagleMessage>(), Arg.AnyInt).IgnoreArguments().DoInstead(
        (BasicEagleMessage arg1, int arg2) => called = true).Returns(true).MustBeCalled();
    Mock.NonPublic.Arrange<bool>(target, "CheckMessageLength", Arg.AnyInt, ArgExpr.IsAny<BasicEagleMessage>()).IgnoreArguments().DoInstead(
        (int arg1, BasicEagleMessage arg2) => called = true).Returns(true).MustBeCalled();
    Mock.NonPublic.Arrange<bool>(target, "VerifyCheckSum", ArgExpr.IsAny<byte[]>()).IgnoreArguments().DoInstead(
        (byte[] arg1) => called = true).Returns(true).MustBeCalled();
    Mock.NonPublic.Arrange<bool>(target, "ValidateLegacyMessageType", ArgExpr.IsAny<BasicEagleMessage>()).IgnoreArguments().DoInstead(
        (BasicEagleMessage arg1) => called = true).Returns(true).MustBeCalled();
    actual = target.ValidateMessage(message, 3, TowerTypes.Tower4800);
    Assert.AreEqual(expected, actual);
    Mock.Assert(target);
}

///<summary>
///  A test for CheckMessageLength
///</summary>
[TestMethod]
public void CheckMessageLengthTest()
{
    var message = new byte[] { (byte)3, BitConverter.GetBytes((ushort)59006)[0], BitConverter.GetBytes((ushort)59006)[1], 0 };
    var byteCount = 32486;
    bool expected = true;
    bool actual;
    //mock the other members in EagleUtility that are being used...
    var target = new EagleUtility();
    bool called = true;
    Mock.NonPublic.Arrange<bool>(target, "CheckMinimumSize", ArgExpr.IsAny<BasicEagleMessage>(), Arg.AnyInt).IgnoreArguments().DoInstead(
        (BasicEagleMessage arg1, int arg2) => called = true).Returns(true).MustBeCalled();
    Mock.NonPublic.Arrange<bool>(target, "CheckCommError", ArgExpr.IsAny<BasicEagleMessage>()).IgnoreArguments().DoInstead(
        (BasicEagleMessage arg2) => called = true).Returns(true).MustBeCalled();
    Mock.NonPublic.Arrange<bool>(target, "VerifyCheckSum", ArgExpr.IsAny<byte[]>()).IgnoreArguments().DoInstead(
        (byte[] arg1) => called = true).Returns(true).MustBeCalled();
    Mock.NonPublic.Arrange<bool>(target, "ValidateLegacyMessageType", ArgExpr.IsAny<BasicEagleMessage>()).IgnoreArguments().DoInstead(
        (BasicEagleMessage arg1) => called = true).Returns(true).MustBeCalled();
    actual = target.ValidateMessage(message, byteCount, TowerTypes.Tower4800);
    Assert.AreEqual(expected, actual);
    Mock.Assert(target);
}

当我单独运行它们时,它们会通过但是当作为一组运行时,第一个方法通过而第二个方法失败。根据我运行测试的方式(哪个测试运行器),测试方法在不同的断言上失败,使用mstest在Asser.AreEqual上失败,而使用JustCode testrunner它在Mock.Assert上失败(声明标记为MustBeCalled的方法未被调用)。

我有Mock.Initialize();在我的测试类的类初始化函数中。

我感谢任何帮助,并提前感谢你们。

1 个答案:

答案 0 :(得分:1)

两个链接可能会对您有所帮助: