Тесты NUnit игнорируются

У меня есть следующий класс тестовых приспособлений, и по причинам, не зависящим от меня, NUnit решает запустить все тестовые классы вокруг этого, но не этого.

using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;   
using MyProject;
using NUnit.Framework;

namespace MyProject.Test
{
    [TestFixture]
    public class MyProjectTests
    {
        private const string Description = "This is a test Description generated through UNIT Tests";

        private ManualWorkflowSchedulerService scheduler;
        private WorkflowRuntime workflowRuntime;

        [SetUp]
        public void Init()
        {
            // set up workflow scheduler and runtime
            this.workflowRuntime = new WorkflowRuntime();
            this.scheduler = new ManualWorkflowSchedulerService(true); // run synchronously
            this.workflowRuntime.AddService(this.scheduler);
            this.workflowRuntime.StartRuntime();

            // create Test Case Sources
            object[] insertScenarios = 
                {
                    new object[] { typeof(RaiseScenario), this.workflowRuntime, Description, true, true, string.Empty },
                    new object[] { typeof(RaiseScenario), this.workflowRuntime, Description, true, false, "New Reason" }
                };
        }

        /// <summary>
        /// The insert tests.
        /// </summary>
        /// <param name="runtime">
        /// The runtime.
        /// </param>
        /// <param name="description">
        /// The description.
        /// </param>
        /// <param name="outstandingWorkDocUploaded">
        /// The Doc One Uploaded.
        /// </param>
        /// <param name="DocTwoUploaded">
        /// The Doc Two Uploaded.
        /// </param>
        /// <param name="shortageReason">
        /// The shortage Reason.
        /// </param>
        [Test, TestCaseSource("insertScenarios")]
        public void TestInsert(
            WorkflowRuntime runtime,
            string description,
            bool DocOneUploaded,
            bool DocTwoUploaded,
            string Reason)
        {
            var message = Business.InsertBoatHandoverOutsideCrew(runtime, description, DocOneUploaded, DocTwoUploaded, Reason);
            Assert.AreNotEqual(0, message.Id);
        }

    }
}

Структура тестового проекта разделена на составные части, т. е. каждый подпроект решения имеет свой собственный каталог в тестовом проекте. Это не было проблемой для всех других проектов, написанных в .Net 3.5, но тесты этого проекта теперь игнорируются.


person Deviland    schedule 22.08.2012    source источник
comment
Не совсем ответ, но вы сами форматировали эти комментарии?   -  person ChrisBint    schedule 22.08.2012
comment
это вывод GhostDoc по умолчанию, угу   -  person mtijn    schedule 22.08.2012
comment
Возможно ли, что insertScenarios просто недоступен? Вы сделали это локальной переменной Init().   -  person Wiktor Zychla    schedule 22.08.2012
comment
@mtijn хорошая попытка, но это смесь resharper и stylecop   -  person Deviland    schedule 22.08.2012
comment
@WiktorZychla изучает это   -  person Deviland    schedule 22.08.2012
comment
Я разместил это как ответ, так как почти на 100% уверен, что это он.   -  person Wiktor Zychla    schedule 22.08.2012


Ответы (4)


Все еще не понимаю, почему NUnit должен игнорировать ваше тестовое приспособление (на основе опубликованного фрагмента кода). В фрагменте кода чего-то не хватает?

Как заметил Виктор,

Аргумент sourceName представляет имя источника, используемого для предоставления тестовых случаев. Он имеет следующие характеристики: Это может быть поле, свойство или метод. Это может быть либо экземпляр, либо статический член. Он должен возвращать IEnumerable или тип, реализующий IEnumerable. Отдельные элементы, возвращаемые перечислителем, должны быть совместимы с сигнатурой метода, в котором появляется атрибут.

Однако с приведенным выше фрагментом кода вы должны получить конкретный тест, помеченный как недействительный, а не игнорируемый (с использованием NUnit v2.5.10 на Fwk 4.0).

namespace AJack
{
    [TestFixture]
    public class ParameterizedTestsDemo
    {
        private object[][] _inputs;

        public ParameterizedTestsDemo()
        {
            Console.Out.WriteLine("Instantiating test class instance");
            _inputs = new[]{ new object[]{1,2,3}, 
                                 new object[]{4,5,6} }; 
        }

        [TestFixtureSetUp]
        public void BeforeAllTests()
        {
            Console.Out.WriteLine("In TestFixtureSetup");
            object[] localVarDoesNotWork = {   new object[]{1,2,3}, 
                                    new object[]{4,5,6} };
            /*this will NOT work too
            _inputs = new[]{ new object[]{1,2,3}, 
                                 new object[]{4,5,6} }; */
        }

        [TestCaseSource("localVarDoesNotWork")]
        public  void WillNotRun(int x, int y, int z)
        {
            Console.Out.WriteLine("Inputs {0}, {1}, {2}", x,y,z);
        }
        [TestCaseSource("PropertiesFieldsAndMethodsWork")]
        public void TryThisInstead(int x, int y, int z)
        {
            Console.Out.WriteLine("Inputs {0}, {1}, {2}", x, y, z);
        }
        private object[] PropertiesFieldsAndMethodsWork
        {
            get {
                Console.Out.WriteLine("Getting test input params");

                return _inputs;
            }
        }
    }
}

Если вы установите точки трассировки в Console.Out.WriteLines и подключите отладчик, вы увидите, что когда сборка загружается (строится тестовое дерево), попадание точек трассировки

Test Class constructor
Retrieve test case inputs from property/field/method

Когда вы запускаете тесты,

Test Class constructor
InTestFixtureSetup

Итак, суть в том, что вам нужно будет назначить поля экземпляра в ctor тестового класса, чтобы это работало. вы не можете использовать методы Setup, потому что они не вызываются при разрешении параметризованных тестовых входных данных. . Также, когда он не может разрешить входные данные, вы должны увидеть красный цвет с исключением, например

AJack.ParameterizedTestsDemo.WillNotRun:
System.Exception : Unable to locate AJack.ParameterizedTestsDemo.localVarDoesNotWork
person Gishu    schedule 23.08.2012

Это должно работать, если вы возьмете тестовые случаи из SetUp

// create Test Case Sources
public object[] insertScenarios = 
        {
            new object[] { typeof(RaiseScenario), this.workflowRuntime, Description, true, true, string.Empty },
            new object[] { typeof(RaiseScenario), this.workflowRuntime, Description, true, false, "New Reason" }
        };

/// <summary>
/// The init.
/// </summary>
[SetUp]
public void Init()
{
    // set up workflow scheduler and runtime
    this.workflowRuntime = new WorkflowRuntime();
    this.scheduler = new ManualWorkflowSchedulerService(true); // run synchronously
    this.workflowRuntime.AddService(this.scheduler);
    this.workflowRuntime.StartRuntime();

}
person Wiktor Zychla    schedule 22.08.2012
comment
не может иметь это в статическом члене, поэтому это было в init(), поэтому я мог обойти это. - person Deviland; 22.08.2012
comment
верно, но не означает ли это, что я использовал это в инициализаторе. Я никогда не пробовал это (в тесте), но как насчет конструктора для инициализации insertScenarios? (извините, пришлось исправить мой плохой английский, иногда я печатаю быстрее, чем думаю, лол) - person Deviland; 22.08.2012
comment
Источник тестового примера должен быть полем, свойством или методом. Я не думаю, что имеет значение, как вы его инициализируете или каковы внутренние детали реализации. Например, если это метод, он может возвращать что угодно, вычисляемое где угодно. - person Wiktor Zychla; 22.08.2012
comment
Да, я медленно догоняю вас, но теперь вернемся к более простым объектам ошибок, не установленным в экземпляр объекта (все еще игнорируется) - person Deviland; 22.08.2012
comment
Не могу помочь вам с исключениями нулевых ссылок и другими специфическими вещами, вы должны тщательно отлаживать их. Это выходит за рамки вашей первоначальной проблемы. - person Wiktor Zychla; 22.08.2012

Я никогда не видел тестов, в которых пустота принимает аргументы, вы собираетесь это сделать? Я думаю, именно поэтому ваш тест в этом классе не выполняется.

[Test, TestCaseSource("insertScenarios")]
public void TestInsert()
{
    WorkflowRuntime runtime = //some value;
    string description = //some value; 
    bool DocOneUploaded = //some value;
    bool DocTwoUploaded = //some value;
    string Reason = //some value;

    var message = Business.InsertBoatHandoverOutsideCrew(runtime, description, DocOneUploaded, DocTwoUploaded, Reason);
    Assert.AreNotEqual(0, message.Id);
}

Если вы действительно хотите, чтобы эти значения находились за пределами вашего тестового примера, используйте их снаружи как переменную, которую вы можете установить в примере Init():

private WorkflowRuntime RunTime;

    [Setup]
    public void Init()
    {
    RunTime = new WorkflowRuntime();
    }

    [Test]
    public void TestInsert()
    {
    //RunTime can now be accessable here.
    }
person Jonas W    schedule 22.08.2012
comment
Это называется параметризованными тестами, метод тестирования принимает аргументы, а атрибут TestCaseSource указывает метод, который должен предоставлять аргументы. nunit.org/index.php?p=testCaseSource&r=2.5 - person Wiktor Zychla; 22.08.2012
comment
Это то, что я использую nunit.org/index.php?p=testCaseSource&r= 2.5 У меня есть несколько сценариев для ввода, и я хочу иметь настройку, в которой я пишу один огонь много - person Deviland; 22.08.2012
comment
не беспокойтесь, поэтому мы (особенно я сейчас) все здесь ;) - person Deviland; 22.08.2012

вы можете применить условие if для этого случая, и это условие if применяется к атрибуту [TestFixtureSetUp] в этом условии, если вы можете использовать Assert.Ignore("").

person Himanshu Bajpai    schedule 22.08.2012