Как выполнить тестирование 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(...);
Надеюсь это поможет