Использование родинок с xUnit — неправильная версия dll

#.net #dll #xunit #moles #pex-and-moles

#.net #dll #xunit #родинки #pex-и-родинки

Вопрос:

Я пытаюсь настроить Moles для использования в нашем модульном тестировании. Мы используем xunit, поэтому я являюсь using расширением Xunit, которое поставляется с moles ( Microsoft.Moles.Framework.Xunit ). Однако, поскольку мы запускаем Xunit 1.7, Moles жалуется, что я не запускаю версию 1.6.1.1521 (с FileLoadException ).

В руководстве по Moles (страница 28) говорится:

xUnit.net Версия:

1.5.0.1479 (для других xUnit.net версии, перекомпилируйте атрибут из исходных текстов)

Вот где я застрял — доступен ли где-нибудь исходный код для этого расширения xunit? Или мне придется использовать конкретную версию xunit, которая требуется Moles?

Ответ №1:

Вы не можете определить перенаправление привязки сборки в moles.runner.exe.config ?

 <configuration>
    <runtime>
        <assemblyBinding  xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity
                    name="xunit.dll"
                    publicKeyToken="8d05b1bb7a6fdb6c" />
                <bindingRedirect oldVersion="1.5.0.1479" newVersion="1.6.1.1521" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>
  

Ответ №2:

Если вам нужно перекомпилировать, вы можете это сделать. Я искал исходный код Moles, но нигде не смог его найти. Затем я попытался разобрать Microsoft.Родинки.Xunit.dll и я понял, что атрибут имеет длину всего в несколько строк.

Исходный код атрибута MoledAttribute:

 using System;
using System.Reflection;
using XUnit;

namespace Microsoft.Moles.Framework.Xunit
{
    public sealed class MoledAttribute : BeforeAfterTestAttribute
    {
        // Fields
        private IDisposable _molesContext;

        public override void Before(MethodInfo methodUnderTest)
        {
            this._molesContext = MolesContext.Create();
        }

        public override void After(MethodInfo methodUnderTest)
        {
            IDisposable disposable = this._molesContext;
            if (disposable != null)
            {
                disposable.Dispose();
            }
            this._molesContext = null;
        }
    }
}
  

Вам следует создать новую библиотеку классов и добавить ссылку на свой xunit.dll любой версии, которую вы хотите. Это должно работать даже с 1.8.0.1545, поскольку я не заметил никаких изменений в xUnit.BeforeAfterTestAttribute, который является единственной зависимостью.

Ответ №3:

Хотя ответ proxon был очень полезен для выполнения моей задачи, позвольте мне представить лучший ответ, который я нашел по мере дальнейшего изучения (надеюсь, помочь другим, столкнувшимся с этой проблемой). Исходный код находится в C:Program FilesMicrosoft MolesDocumentationmoles.samples.zip . Конечно, в значительной степени идентичный код, который декомпилировал proxon.

Вы также можете найти там оболочки NUnit и MbUnit.