будет ли сериализованный интерфейс по-прежнему сериализоваться в файл? - PullRequest
2 голосов
/ 12 мая 2009

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

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

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

Мне известно, что сериализация интерфейса сохраняет конкретные данные , но будет ли сериализованный интерфейс сериализоваться?

Ответы [ 2 ]

1 голос
/ 12 мая 2009

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

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

0 голосов
/ 21 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...