Модульное тестирование правила асинхронной проверки CSLA

У меня есть правило проверки для стереотипного класса CSLA Business Base. У меня возникли проблемы с выяснением того, как выполнить модульное тестирование правила проверки, поскольку оно включает лямбда-выражение асинхронного обратного вызова. Вот пример кода:

using System;
using System.Collections.Generic;
using Csla;
using Csla.Validation;

namespace UnitTestCSLAAsyncValidationRule
{
    public class BusinessObject : BusinessBase<BusinessObject>
    {
        protected static PropertyInfo<string> CodeProperty = RegisterProperty<string>(p => p.Code);
        public string Code
        {
            get { return GetProperty(CodeProperty); }
            set { SetProperty(CodeProperty, value); }
        }

        protected override void AddBusinessRules()
        {
            ValidationRules.AddRule(CodeValidator, new AsyncRuleArgs(CodeProperty));
        }

        public static void CodeValidator(AsyncValidationRuleContext context)
        {
            var code = (string) context.PropertyValues["Code"];

            CodeList codeList;
            CodeList.GetCodeList((o, l) =>
                {
                    codeList = l.Object;
                    if (codeList.Contains(code))
                    {
                        context.OutArgs.Result = false;
                        context.OutArgs.Description = "Code already in use.";
                    }
                    else
                    {
                        context.OutArgs.Result = true;
                    }
                });

            context.Complete();

        }
    }

    public class CodeList : List<string>
    {
        public static void GetCodeList(EventHandler<DataPortalResult<CodeList>> handler)
        {
            DataPortal<CodeList> dp = new DataPortal<CodeList>();
            dp.FetchCompleted += handler;
            dp.BeginFetch();
        }

        private void DataPortal_Fetch()
        {
            // some existing codes..
            Add("123");
            Add("456");
        }
    }
}

Я хотел бы проверить это с помощью теста, подобного следующему:

using NUnit.Framework;

namespace UnitTestCSLAAsyncValidationRule.Test
{
    [TestFixture]
    public class BusinessObjectTest
    {
        [Test]
        public void CodeValidationTest()
        {
            var bo = new BusinessObject();
            bo.Code = "123";

            Assert.IsNotEmpty(bo.BrokenRulesCollection);
        }
    }
}

Однако тестовый Assert запускается перед асинхронным обратным вызовом. Может ли с этим помочь UnitDriven? Я посмотрел на это, но не вижу, как использовать его в этом сценарии.

Спасибо, Том


person Tom Hunter    schedule 03.02.2011    source источник


Ответы (1)


Ответ от JonnyBee на http://forums.lhotka.net/forums/p/10023/47030.aspx#47030:

using NUnit.Framework;
using UnitDriven;

namespace UnitTestCSLAAsyncValidationRule.Test
{
    [TestFixture]
    public class BusinessObjectTest : TestBase
    {
        [Test]
        public void CodeValidationTest()
        {
            UnitTestContext context = GetContext();

            var bo = new BusinessObject();
            bo.ValidationComplete += (o, e) =>
                {
                    context.Assert.IsFalse(bo.IsValid);
                    context.Assert.Success();
                    //Assert.IsNotEmpty(bo.BrokenRulesCollection);
                };

            bo.Code = "123";

            context.Complete();
        }
    }
}

Пожалуйста, не было небольшой ошибки в моем методе правила проверки - вызов AsyncValidationRuleContext.Complete() должен быть внутри лямбда.

Спасибо,
Том

person Tom Hunter    schedule 04.02.2011