2011-02-03 27 views
0

我在CSLA Business Base原型類上有驗證規則。我無法弄清楚如何單元測試驗證規則,因爲它包含異步回調lambda表達式。下面是一些示例代碼:單元測試CSLA異步驗證規則

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); 
     } 
    } 
} 

然而,測試斷言異步回調之前運行。這是UnitDriven可以幫助的嗎?我已經看過它,但在這種情況下看不到如何使用它。

感謝, 湯姆

回答

0

通過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(需要在裏面拉姆達。

謝謝,
Tom