Мне нужно вызвать некоторый код из Main и из GUI тестов testtack - PullRequest
0 голосов
/ 05 октября 2018

Я опишу мою проблему, а затем дам вам код.Я хочу создать приложение в 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 testtack, но яs типа Window, предоставляемые testtack и, следовательно, не дают полного доступа к членам 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), так и в тестах).Где я должен поставить код и как я могу это назвать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...