Функция ведет себя по-разному, если запустить в модульном тесте или консольного приложения - PullRequest
0 голосов
/ 08 ноября 2018

Мы используем старую стороннюю библиотеку. Библиотека представляет собой DLL, которая была скомпилирована из C давно. Когда я запускаю определенную функцию из модульного теста, я получаю правильный вывод. Когда я запускаю точно такой же код - сравниваемый побайтно - в консольном приложении или в любой другой форме выполнения, я вместо этого получаю неверный вывод. Я понятия не имею, что происходит. Я не могу предоставить стороннюю библиотеку, но могу предоставить код, который мы запускаем, чтобы это произошло, и код очень минимальный.

В проекте библиотеки классов, который загружается в DLL и запускает функцию:

public class HFSAPI
{
    [DllImport("C:\\MCRIF32\\HFSWSAPI.dll")]
    static extern void GetMCRDataA(String instructions, StringBuilder result);

    public string GetData(string input)
    {
        StringBuilder output = new StringBuilder(new String(' ', 10000000));
        GetMCRDataA(input, output);
        return output.ToString();
    }
}

Юнит-тест:

[TestClass]
public class UnitTest1
{

    [TestMethod]
    public void GetBPart1AndCostCenters()
    {
        HFSAPI test = new HFSAPI();
        String input = File.ReadAllText("C:\\absolute\\path\\to\\XMLFile1.xml");
        String result = test.GetData(input);
        File.WriteAllText("Output.txt", result);
        Assert.AreEqual(true, true);
    }
}

Мое консольное приложение, пытаясь функционировать, просто загружает в модульном тесте и запускает его следующим образом:

    static void Main(string[] args)
    {
        var unitTest = new UnitTest1();
        unitTest.GetBPart1AndCostCenters();
        var result = File.ReadAllText("Output.txt");
        Console.WriteLine(result);
    }

Понятия не имею, как это не работает. Я начинаю думать, что это проблема уровня компилятора в той или иной форме. В модульном тесте, если я запускаю или отлаживаю его, я получаю правильный вывод - в любом случае. В любой форме консольного приложения, если я запускаю какой-либо код, ДАЖЕ НЕПОСРЕДСТВЕННО ВЫЗЫВАЯ САМОПРОВЕРКУ БЛОКА, я получаю неверный ввод. Как отмечено в приведенном выше коде, все пути являются абсолютными, поэтому они не используют разные входные данные или что-то в этом роде.

Для полноты, вот файл XML, который загружается с инструкциями:

<?xml version="1.0" encoding="utf-16"?>
<instructions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <files>
        <file type="2552-10" instruction="Batch">C:\absolute\path\to\041331_12312016.mcrx</file>
    </files>
    <instruction name="Batch">
        <read id="worksheetsex">
        </read>
    </instruction>
</instructions>

У кого-нибудь есть какие-либо указания относительно того, почему такое поведение происходит, и как я могу это исправить? Я не могу просто продолжать модульное тестирование, чтобы постоянно получать правильный вывод для следующего шага. Это неосуществимо. Есть какой-то флаг, который установлен или что-то?

Редактировать для пояснения: при запуске через модульный тест выводится строка XML длиной более 368 000 символов. Это правильный и ожидаемый результат. При запуске через консольное приложение его длина составляет 637 символов. Это дает вам представление о том, на какие порядки он рассчитан.

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