MissingMethodException при запуске модульного теста, использующего FSharp.Data
У меня есть модульный тест NUnit, который написан в обычной библиотеке F#, но нацелен на код F# в Portable Class Library.
Когда я запускаю этот тест (в Visual Studio 2013), я получаю следующее исключение:
Result Message: System.MissingMethodException : Method not found:
'Microsoft.FSharp.Control.FSharpAsync`1<System.IO.TextReader> FSharp.Data.Runtime.IO.asyncReadTextAtRuntime(System.Boolean, System.String, System.String, System.String, System.String)'.
Вот что я имею в своем app.config в Portable Class Library:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.3.1.0" newVersion="3.3.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Это то, что у меня есть в app.config моей обычной библиотеки F#:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.3.1.0" newVersion="4.3.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.6.3.13283" newVersion="2.6.3.13283" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
4 ответа
Видимо, FSharp.Data не поддерживает библиотеки PCL с использованием профиля 7. После изменения профиля моего проекта PCL на 47 все работает, как и ожидалось.
MissingMethodException означает именно это (с точки зрения подписи).
Похоже, ваш тестовый код не имеет ссылки на версию FSharp.Data
DLL, которую использует ваша портативная библиотека.
Подпись метода для asyncReadTextAtRuntime
был изменен совсем недавно, поэтому вы должны ссылаться на последнюю версию в вашем тестовом проекте.
Посмотрите этот коммит GitHub, где функция была изменена, чтобы получить дополнительный параметр с именем formatName
:
https://github.com/fsharp/FSharp.Data/commit/be3651f314b7a13b57a755a728287373adda775d
У меня была такая же проблема, и я не знал, что это связано с PCL. Добавление явного перенаправления привязки в (C#) тестовый проект для FSharp.Core заставило его исчезнуть (на самом деле у меня была такая же проблема в Linqpad)
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-999.999.999.999" newVersion="4.4.0.0" />
</dependentAssembly>
</assemblyBinding>
(Проект тестирования в C# не имеет прямых ссылок на FSharp, кроме того, что он наследует от проектов F#, которые он тестирует)
Я обновил свою версию DLL до более ранней версии.
В моем случае я пытался использовать провайдеры типов в DLL-библиотеке FSharp.Data.
Я обновил FSharp.Data до более ранней версии, и ошибка исчезла.