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.