будет ли фиктивный интерфейс по-прежнему сериализоваться в файл?

Я пытаюсь выполнить юнит-тест при сохранении файла. У меня есть интерфейс, который определяет документ, и я передаю конкретный объект, реализующий этот интерфейс, методу Save, и он работает на практике, но я пытаюсь выполнить модульное тестирование, чтобы убедиться, что он всегда будет работать (и я ' m отчаянно пытается наверстать упущенное с юнит-тестами после периода «критического времени»).

Мой способ сохранения довольно прост, он работает так:

public Boolean SaveDocument(IDocument document)
{
    BinaryFormatter bFormatter = new BinaryFormatter();
    FileStream fs = null;

    try
    {
        if (!Directory.Exists(folderName))
            Directory.CreateDirectory(folderName);

        String path = Path.Combine(Path.Combine(folderName, document.FileName), document.Extension);
        using (fs = new FileStream(path, FileMode.OpenOrCreate))
        {
            bFormatter.Serialize(fs, document);
        }
    }
    catch (IOException ioex)
    {
        LOG.Write(ioex.Message);
        return false;
    }

    return true;
}

и мой тест:

[Test]
public void can_save_a_document()
{
    String testDirectory = "C:\\Test\\";
    m_DocumentHandler = new DocumentHandler(testDirectory);

    DynamicMock mock = new DynamicMock(typeof(IDocument));

    mock.ExpectAndReturn("get_FileName", "Test_File");
    mock.ExpectAndReturn("get_Extension", ".TST");

    m_DocumentHandler.SaveDocument(mock.MockInstance as IDocument);

    try
    {    
        Assert.IsTrue(Directory.Exists(testDirectory), "Directory was not created");
        String[] filesInTestDir = Directory.GetFiles(testDirectory);

        Assert.AreEqual(1, filesInTestDir.Length, "there is " + filesInTestDir.Length.ToString() + " files in the folder, instead of 1");
        Assert.AreEqual(Path.GetFileName(filesInTestDir[0]), "Test_File.TST");
    }
    finally
    {
        Directory.Delete(testDirectory);
        Assert.IsFalse(Directory.Exists(testDirectory), "folder was not cleaned up");
    }
}

Я знаю, что сериализация интерфейса сохраняет конкретные данные, но Будет ли сериализован издеваемый интерфейс?


person Steven Evers    schedule 11.05.2009    source источник


Ответы (2)


BinaryFormatter использует фактический тип переданного объекта, а не интерфейс, когда он сериализует данные. Таким образом, внутри он будет писать что-то вроде Type: MyLib.Objects.MyObj, MyLib, когда вы передаете реальный объект, и Type: Moq.ConcreteProxy, Moq и т. Д., Когда вы передаете фиктивный объект.

Использование BinaryFormatter для постоянства в любом случае доставит вам неприятности, поскольку вам придется иметь дело с различиями в управлении версиями и разметке памяти между выпусками. Было бы намного лучше установить четко определенный формат для вашего документа и писать объекты и поля вручную.

person Paul Alexander    schedule 11.05.2009

Если вам нужно проверить, как сериализация работает с классом, создайте несколько реальных классов для теста и используйте их. Мокинг полезен для тестирования взаимодействия между взаимодействующими объектами.

person Steve Freeman    schedule 21.05.2009