如何在其内部的虚拟方法中对C#中的Ampract类执行MOQ测试



我想对下面的抽象Streaming类进行测试,该类别具有两个虚拟方法,这些方法在同一项目的Asset类中被覆盖。这里SerializeBinary()方法将对象转换为二进制流,而DeserializeFromBinary()方法则与SerializeBinary()相反。

如何编写测试类,用于使用iOQ?

进行比较

我从这里进行:

这是我的代码的一部分:

Streaming类:

public abstract class Streaming
{
        private static int _streamingIDExponent = 41;
        public const string MonthLookup = "ABCDEFGHIJK";
        public const string ExpiryStringFormat = "ddMMMyyyy";
        public const double DefaultTicksPerPoint = 3;
        private long _StreamingID;
        private int _minQty = DefaultMinimumQty;
        public virtual void SerializeBinary(BinaryStreamWriter binaryStreamWriter)
        {
                 binaryStreamWriter.Write(_StreamingID);
                 binaryStreamWriter.Write(_ex_StreamingID);
                 binaryStreamWriter.Write(_minQty);
                 binaryStreamWriter.Write(_extendedProperties.Count);
                 foreach (KeyValuePair<StreamingPropertyName, StreamingProperty> dictionaryEntry in _extendedProperties)
                 {
                     dictionaryEntry.Value.SerializeBinary(binaryStreamWriter);
                 }
}
public virtual bool DeserializeFromBinary(BinaryStreamReader binaryStreamReader, out string errorString)
{
         errorString = string.Empty;
         try
         {
               _StreamingID = binaryStreamReader.ReadInt64();
               _exStreamingID = binaryStreamReader.ReadInt64();
               _minQty = binaryStreamReader.ReadInt32();    
         }
         catch (Exception oEx)
         {
               errorString = oEx.Message;
         }
         return string.IsNullOrEmpty(errorString);
}

Asset类:

public class Asset : Streaming
{
    public override void SerializeBinary(BinaryStreamWriter binaryStreamWriter)
    {
        base.SerializeBinary(binaryStreamWriter);
    }
    public override bool DeserializeFromBinary(BinaryStreamReader binaryStreamReader, out string errorString)
    {
            if (!base.DeserializeFromBinary(binaryStreamReader, out errorString))
                   return false;
            try
            {
                  return true;
            }
            catch (Exception oEx)
            {
                 errorString = oEx.Message;
                 return false;
            }
     }
 }

您可以创建类似流的新模拟:

var streamingMock = new Mock<Streaming> { CallBase = true };

呼叫基础很重要,因为它将在您的具体类中执行实现的代码。然后,您可以通过对象属性调用方法:

streamingMock.Object.SerializeBinary(...);

希望这有帮助

在当前实现中,没有一个很好的方法来测试AssetStreaming与MOQ之间的相互作用。但是,如果您愿意更改课程的实现,则可以完成。基本上,您需要将Streaming类方法的逻辑移动到新方法中,然后可以模拟这些方法。

public abstract class Streaming
{
    public virtual void SerializeBinaryCore(BinaryStreamWriter writer)
    {
        // put the logic from your original SerializeBinary method here...
    }
    public virtual bool DeserializeFromBinaryCore(BinaryStreamReader reader, out string errorMessage)
    {
        // put the logic from your original DeserializeFromBinary method here...
    }
    public abstract void SerializeBinary(BinaryStreamWriter writer);
    public abstract bool DeserializeFromBinary(BinaryStreamReader reader, out string errorMessage);
}

,然后按以下方式调整您的Asset类:

public class Asset : Streaming
{
    public override void SerializeBinary(BinaryStreamWriter writer)
    {
        SerializeBinaryCore(writer);
    }
    public override void DeserializeFromBinary(BinaryStreamReader reader, out string errorMessage)
    {
        var result = DeserializeFromBinaryCore(reader, out errorMessage);
        // put the rest of your Asset deserialization logic here...
    }
}

在测试中,您需要创建一个Mock<Asset> { CallBase = true },然后为SerializeBinaryCoreDeserializeFromBinaryCore方法创建设置。

最新更新