DotNetOpenAuth.Asp не может загрузить сборку или одну из ее зависимостей в тестах модулей приложений MVC4

Я сталкиваюсь с очень странной ошибкой в ​​моем проекте. Я установил DotnetOpenAuth.Aspnet и Microsoft.AspNet.WebPages.OAuth библиотеки nuget пакетов. Когда я запускаю проект, проблем нет. Но когда я пишу тест для контроллеров, он генерирует исключение, подобное следующему.

Метод тестирования MvcApplication2.Tests.ControllerTest.should_return_not_empty_content исключил исключение:

    System.IO.FileLoadException: Could not load file or assembly 'DotNetOpenAuth.AspNet, Version=4.0.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246' 
or one of its dependencies. The located assembly manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Еще один странный момент: если я настрою проект в VS 2010, когда приложение MVC3 и тесты проходят. Без сбоев. Но когда я делаю точно такую ​​же настройку в VS2012, он запускает ту же ошибку, что и выше. Когда я просматриваю stackoverflow, я видел это решение, но он тоже не работал.

Вы можете найти все проекты и образцы тестов в следующих строках. Это всего лишь один тестовый проект для одного приложения. Очень легко читать.

Кроме того, я добавил пример кода для контроллера и теста с ошибкой.

Ссылка pastebin для предварительного просмотра кода http://pastebin.com/1PCpq3hW

Любая помощь будет оценена.

Vs2010 и 2012 сбой и последующие проекты

Подробный результат журнала, например, следующий

    *** Assembly Binder Log Entry  (13.12.2012 @ 22:27:31) ***

    The operation failed.
    Bind result: hr = 0x80131040. No description available.

    Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
    Running under executable  C:\Program Files (x86)\JetBrains\ReSharper\v7.0\Bin\JetBrains.ReSharper.TaskRunner.CLR4.exe
    --- A detailed error log follows. 

    === bind state information ===
    LOG: User = DEVELOPER-PC\DEVELOPER
    LOG: DisplayName = DotNetOpenAuth.AspNet, Version=4.0.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246
     (Fully-specified)
    LOG: Appbase = file:///D:/Development/Coachius/CoachiusWeb.Tests/bin/Debug
    LOG: Initial PrivatePath = NULL
    LOG: Dynamic Base = NULL
    LOG: Cache Base = NULL
    LOG: AppName = NULL
    Calling assembly : CoachiusWeb, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
    ===
    LOG: This bind starts in default load context.
    LOG: Using application configuration file: D:\Development\Coachius\CoachiusWeb.Tests\bin\Debug\CoachiusWeb.Tests.dll.config
    LOG: Using host configuration file: 
    LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
    LOG: Post-policy reference: DotNetOpenAuth.AspNet, Version=4.0.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246
    LOG: GAC Lookup was unsuccessful.
    LOG: Attempting download of new URL file:///D:/Development/Coachius/CoachiusWeb.Tests/bin/Debug/DotNetOpenAuth.AspNet.DLL.
    LOG: Assembly download was successful. Attempting setup of file: D:\Development\Coachius\CoachiusWeb.Tests\bin\Debug\DotNetOpenAuth.AspNet.dll
    LOG: Entering run-from-source setup phase.
    LOG: Assembly Name is: DotNetOpenAuth.AspNet, Version=4.1.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246
    WRN: Comparing the assembly name resulted in the mismatch: Minor Version
    ERR: The assembly reference did not match the assembly definition found.
    ERR: Run-from-source setup phase failed with hr = 0x80131040.
    ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

Ответ 1

Я решил его с помощью

 <configuration>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>

Ответ 2

Думаю, я нашел возможное решение.

Смотрите ссылку

Ключевыми элементами информации здесь являются строки 3 и 7. В принципе, Microsoft.Web.WebPages.OAuth нуждается в DotNetOpenAuth.Core 4.0.0.0, но у DotNetOpenAuth.Core у меня есть версия 4.3.0.0.

Ответ 3

Это связано с очень неприятной ошибкой в ​​VS 2012. В VS 2012 в тестовых проектах перенаправление сборки в файле app.config не работает.

Это объясняет, почему он работает в VS 2010, а не в VS 2012.

Это довольно раздражает.

Обход - это добавить файл .testsettings и связать его с тестовым меню с проектом. Для этого вам нужно перейти в папку решений, если вы не увидите ее в меню.

Остерегайтесь, много ресурсов в Интернете говорит, что runsettings с форсированием старой версии для работы будет делать трюк, это не так. Это приведет к сбою вашего процесса VS/тестирования. Вам нужен файл testettings.

Что вы делаете, это использовать бегун VS2010, который не имеет этой ошибки. С другой стороны, он медленнее.

Я надеюсь, что Microsoft скоро это исправит, проблема заключается не только в OpenAuth, но и буквально с каждой DLL, используя другую версию из другой DLL.

Добро пожаловать в версию DLL Hell 2012 года.

Ответ 4

Посмотрите на bindingRedirects в файле web.config и убедитесь, что они также существуют в вашем файле unit test app.config.

Ответ 5

Вы добавили сборки в свой тестовый проект? Они должны появляться в папке при компиляции. Поскольку ваш тестовый проект является хостом, ему нужны те же сборки для тестирования (в зависимости от настройки, но как общего правила).

Если да, тогда вы можете посмотреть еще один шаг в фактических деталях привязки.

См. мои сообщения о включении регистрации фьюжн. Как включить ведение журнала сбоев сборки (Fusion) в .NET

Включите его, проверьте папку и найдите сбои привязки - вы увидите, какая сборка пытается загрузить ее (обычно). Если вы этого не сделаете - включите успехи и сбои и, в свою очередь, посмотрите на все версии сборки. Иногда вы увидите несколько загруженных версий, которые помогают отслеживать проблему или неожиданную версию.

Ответ 6

Я изменил версии до 4.1.0.0, и это сработало для меня

 <dependentAssembly>
    <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780CCD10D57B246" culture="neutral" />
    <bindingRedirect oldVersion="1.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780CCD10D57B246" culture="neutral" />
    <bindingRedirect oldVersion="1.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
  </dependentAssembly>