好的,所以我对 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(); 在我的测试类的类初始化函数中。
感谢您的帮助,并提前感谢大家。