Мне нужно вызвать некоторый код из 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), так и с тестами). Где я должен поместить код и как я могу это назвать?

0 ответов

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