Мне нужно вызвать некоторый код из Main и из GUI тестов testtack
Я опишу мою проблему, а затем дам вам код. Я хочу создать приложение в C# с использованием visual studio с помощью teststack.white, инструмента, позволяющего тестировать GUI. Я пытаюсь использовать подход TDD.
Мое приложение WPF содержит сетку данных в MAinWindow, и я хотел бы объявить коллекцию ObservableCollection, привязанную к ячейкам сетки данных.
Проблема, которую я получаю, заключается в том, что я должен объявить свою ObservableCollection способом, который будет запущен в 2 случаях:
- Когда я запускаю приложение в режиме отладки или выпуска
- Когда я тестирую приложение, зная, что teststack.white создает ссылку на MainWindow, но таким образом, что позволяет мне получить доступ только к некоторым компонентам WPF, а не к полям или методам (возможно, я что-то неправильно понял... поправьте меня, если я я не прав)
Теперь вот код:
Тестовый класс, который должен запускать все при запуске тестов:
namespace biblioTk.tests
{
[TestFixture]
class Tests_biblioTk
{
private ApplicationRunner manager;
[SetUp]
public void before()
{
manager=new ApplicationRunner();
}
[TearDown]
public void after()
{
manager.stop();
}
[Test]
public void creerLivreParBoutonSansRechercheISBN()
{
manager.txb_isbn.Text = "haha";
manager.btn_addEmptyBook.Click();
manager.showsEmptyISBNField();
}
[Test]
public void clicSurBoutonCreerLivreSansRechercheISBNAjouteUneLigneATable()
{
//there's at the time being no reference to mainWindow!
mainWindow.core.books.Count.ShouldBe(0);
manager.btn_addEmptyBook.Click();
//here too
mainWindow.core.books.Count.ShouldBe(1);
}
}
}
тестовый класс создает экземпляр ApplicationRunner, который должен управлять всем, что касается приложения, "мета", включая управление содержимым teststack.white:
using System.IO;
using System.Windows.Controls;
using NUnit.Framework;
using Shouldly;
using TestStack.White.Factory;
using Application = TestStack.White.Application;
using Button = TestStack.White.UIItems.Button;
using TextBox = TestStack.White.UIItems.TextBox;
using Window = TestStack.White.UIItems.WindowItems.Window;
namespace biblioTk.sources
{
class ApplicationRunner
{
public Application testsApp;
private Window windowWhite;
public Button btn_addEmptyBook;
public TextBox txb_title;
public TextBox txb_isbn;
public TextBox txb_author;
public TextBox txb_editor;
public ApplicationRunner()
{
initAppAndWindowForTests(assembly:"biblioTk",mainWindowName:"MainWindow");
btn_addEmptyBook = getButtonByName("btn_addEmptyBook");
txb_title = getTextBoxByName("txb_title");
txb_isbn = getTextBoxByName("txb_isbn");
txb_author = getTextBoxByName("txb_author");
txb_editor = getTextBoxByName("txb_editor");
}
private void initAppAndWindowForTests(string assembly,string mainWindowName)
{
var applicationDirectory = TestContext.CurrentContext.TestDirectory;
var appPath = Path.Combine(applicationDirectory, assembly);
testsApp = Application.Launch(appPath);
-----> windowWhite = testsApp.GetWindow(mainWindowName, InitializeOption.NoCache);
}
public TextBox getTextBoxByName(string name)
{
return windowWhite.Get<TextBox>(name);
}
public Button getButtonByName(string name)
{
return windowWhite.Get<Button>(name);
}
public void stop()
{
windowWhite.Close();
}
public void showsEmptyISBNField()
{
txb_isbn.Text.ShouldBe("");
}
}
}
windowWhite получается при вызове API тестового стека, но имеет тип Window, предоставляемый тестовым стеком, и, следовательно, не дает полного доступа к членам MainWindow.
И, наконец, частичное MainWindow, которое содержит знаменитую коллекцию ObservableCollection:
namespace biblioTk
{
/// <summary>
/// Logique d'interaction pour MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public ObservableCollection<Book> books = new ObservableCollection<Book>();
public MainWindow()
{
InitializeComponent();
}
private void createEmptyBook(object sender, RoutedEventArgs e)
{
txb_title.Text = "";
txb_isbn.Text = "";
txb_author.Text = "";
txb_editor.Text = "";
txb_pages.Text = "";
}
}
}
Я знаю, что нужного места для коллекции нет в MainWindow, но мне нужно место, которое можно было бы вызывать как в рабочих сценариях (с использованием способа по умолчанию (я имею в виду использование F5), так и с тестами). Где я должен поместить код и как я могу это назвать?