Mocking Gtk# control для юнит-тестов

Редактировать: Исправлена ​​проблема

Моя проблема (TL;DR)

Я пытаюсь проверить мой Gtk# контролировать реализацию оболочки, но когда я пытаюсь создать свой объект, используя макет Gtk.Button в качестве параметра я получаю

System.MissingMethodException : Method 'MyNameSpace.GUI.GTKSharp.GtkSharpButton..ctor' not found.
    at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
    at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00038] in /build/mono/src/mono-4.6.1/mcs/class/corlib/System.Reflection/MonoMethod.cs:305 

Тестовый код:

[TestFixture]
public class GtkSharpButtonTests
{
    private Mock<Gtk.Button> _buttonMock;

    [TestFixtureSetUp]
    public void BeforeAllSetUp()
    {
        _buttonMock = new Mock<Gtk.Button>();
    }

    [Test]
    public void My_Test()
    {
        var called = false;            
        // ---> System.MissingMethodException
        var button = new GtkSharpButton(_buttonMock.Object);

        // .... rest of the test           
    }
}

Я предполагаю, что когда он пытается создать GtkSharpButton (моя реализация) он создает его с Castle proxy object, но он не находит GtkSharpButton конструктор, который ожидает этот тип.

Также может быть проблема с издевательством над конкретным классом, возможно, я делаю это неправильно.

Я протестировал другие слои с той же техникой, но другие полагаются на интерфейс, так что проще издеваться.

Используемые пакеты:

  • Moq v4.5.23
  • NUnit v2.6.4
  • Castle.Core v3.3.3
  • gtk-sharp v3.0.0 (от gtk-sharp-3.0 v2.99.3)
  • glib-sharp v3.0.0 (от gtk-sharp-3.0 v2.99.3)
  • atk-sharp v3.0.0 (от gtk-sharp-3.0 v2.99.3)

Я использую Linux mono v4.6.1.3 в Monodevelop v5.10.1, Но это также происходит с nunit-console v2.4.8,

Больше информации о том, что я делаю

Я в настоящее время создаю C# приложение, и я хочу абстрагироваться View слой.

Чтобы сделать это, когда я создаю свой Controller Я передаю интерфейс просмотра (напр. IMainWindowView).

Таким образом, я могу смешивать и сочетать разные реализации:

IMainWindowView view = new GtkSharpMainWindowView();
IMainWindowView view = new WPFMainWindowView();

var mainWindowController = new MainWindowController(view);

Пример IMainWindowView:

public interface IMainWindowView
{
    IButton ExampleButtonName { get; }

    IButton ExampleButtonName2 { get; }

    // ....
}

Код за этим

Интерфейсы:

public interface IControl
{
    string Tooltip { get; set; }
}

public interface IButton : IControl
{
    event ButtonClickEventHandler Triggered;

    void Trigger();
}

Реализации обертки:

public abstract class GtkSharpControl : IControl
{
    protected Widget BaseWidget { get; private set; }

    public string Tooltip
    {
        get { return BaseWidget.TooltipText; }
        set { BaseWidget.TooltipText = value; }
    }

    protected GtkSharpControl(Widget widget)
    {
        if (widget == null)
            throw new ArgumentNullException(nameof(widget));

        BaseWidget = widget;
    }
}

public class GtkSharpButton : GtkSharpControl, IButton
{
    public event ButtonClickEventHandler Triggered;

    protected Button BaseWidget
    {
        get { return base.BaseWidget as Button; }
    }

    public GtkSharpButton(Button button)
        : base(button)
    {
        BaseWidget.Clicked += Button_Clicked;
    }

    private void Button_Clicked(object sender, EventArgs e)
    {
        if (Triggered != null)
            Triggered(this, new ButtonEventArgs());
    }

    public void Trigger()
    {
        BaseWidget.Click();
    }
}

Эта реализация в настоящее время работает хорошо, но в настоящее время я не могу проверить уровень реализации элементов управления GtkSharp.

Если вам нужна дополнительная информация, спросите.

1 ответ

Решение

Я исправил свою проблему.

Это была просто проблема использования разных версий библиотеки. Я не использовал то же самое gtk-sharp версия библиотеки для моих тестов и реализации.

Проект Code использовал gtk-sharp2 (V2.12.29)

Тестовый проект использовался gtk-sharp3 (V2.99.3)

Поэтому, когда он создал издевательство, он создал gtk-sharp3 макет кнопки, но мой конструктор класса ожидал gtk-sharp2 Кнопка, так что не удалось.

Спасибо knocte за то, что помогли мне разобраться, спросив, как я установил свой gtk-sharp Lib.

Другие вопросы по тегам