Мы используем старую стороннюю библиотеку. Библиотека представляет собой 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 символов. Это дает вам представление о том, на какие порядки он рассчитан.