Как выполнить тестирование Moq для абстрактного класса в C# для виртуальных методов внутри него?

Я хотел бы провести тестирование ниже Streaming класс, который имеет два виртуальных метода, которые переопределяются в Asset класс в том же проекте. Здесь SerializeBinary() метод преобразует объект в двоичные потоки и DeserializeFromBinary() метод делает противоположность SerializeBinary(),

Как написать тестовый класс для сравнения обоих с помощью Moq?

Я иду отсюда:

Это часть моего кода:

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;
            }
     }
 }

2 ответа

Решение

Там нет хорошего способа проверить взаимодействие между Asset а также Streaming с 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 }, а затем создать настройки для SerializeBinaryCore а также DeserializeFromBinaryCore методы.

Вы можете создать новый макет вашего потокового класса следующим образом:

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

База вызовов важна, потому что она затем выполнит реализованный код в вашем конкретном классе. Затем вы можете вызывать методы через свойство Object:

streamingMock.Object.SerializeBinary(...);

Надеюсь это поможет

Другие вопросы по тегам