2016-09-27 93 views
0

在VS 2015測試模型是有效

這裏上的Web應用程序的工作,MVC 5我的模型:

public class InfoFormulaireEmployeModele 
{ 
    [Required(ErrorMessage =" *You must provide a date")] 
    [RegularExpression("^[0-9]{8}$", ErrorMessage ="The date must be of the format AAAAMMJJ")] 
    public string dateEvenementInitial { get; set; } 
} 

當我嘗試輸入一些無效的輸入,讓我們說「12AB」,它工作正常,我回到頁面上的錯誤消息。

這是我的觀點:

@using PortailLibreService.Models 
@model InfoFormulaireEmployeModele 
@{ 
    ViewBag.Title = "ChampsFormulaireInvalidite"; 
} 

@using (Html.BeginForm()) 
{ 
    <div class="editor-field"> 
     <b>Initial event </b><br> 
     <p>When did the initial event occured?</p> 
     @Html.TextBoxFor(x => x.dateEvenementInitial, new { @placeholder = "AAAAMMJJ" }) @Html.ValidationMessageFor(x => x.dateEvenementInitial, null, new { @class = "error" }) 
    </div> 
    <input type="submit" name="Save" value="Submit" /> 
} 

我想創建一個單元測試,以確保我的模型不會是有效與無效日期條目。

這裏是我的單元測試:

[TestMethod] 
public void testRetourPossibleInvalide() 
{ 
    InfoFormulaireEmployeModele modelDuplicat = new InfoFormulaireEmployeModele(); 

     modelDuplicat.dateEvenementInitial = "abc"; 


     InvFormController controlleur = lib.getController("100237"); 
     var result = controlleur.ChampsFormulaireInvalidite(modelDuplicat); 
     Assert.AreEqual(false, controlleur.ModelState.IsValid); 
} 

出於某種原因,測試失敗,controlleur.ModelState.IsValid是真實的,而應該是假的。如果我只用數值測試它就沒問題。例如,該測試通過:

[TestMethod] 
public void testRetourPossibleInvalide() 
{ 
    InfoFormulaireEmployeModele modelDuplicat = new  InfoFormulaireEmployeModele(); 

    modelDuplicat.dateRetourPossible = "129"; 
    InvFormController controlleur = lib.getController("100237"); 
    var result = controlleur.ChampsFormulaireInvalidite(modelDuplicat); 
    Assert.AreEqual(false, controlleur.ModelState.IsValid); 
} 

controlleur.ModelState.IsValid是假運行測試,同時,使測試通過。

我試圖把一個斷點我控制器的方法內,但在調試時我不能達到它..

+0

在檢查modelstate.isvalid狀態之前,您必須針對您的模型調用controlleur.valid。 –

+0

有沒有這樣的事情controlleur.valid –

+0

如果它的日期,那麼爲什麼在世界上你使用'字符串'而不是'DateTime' –

回答

0

你將不得不充當框架,通常做所有的檢查你。

[TestMethod] 
public void testRetourPossibleInvalide() { 
    var model = new InfoFormulaireEmployeModele(); 

    model.dateEvenementInitial = "abc"; 

    var controller = new InvFormController(); 

    var bindingContext = new ModelBindingContext() { 
     ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, model.GetType()), 
     ValueProvider = new NameValueCollectionValueProvider(new NameValueCollection(), CultureInfo.InvariantCulture) 
    }; 
    var boundModel = new DefaultModelBinder().BindModel(new ControllerContext(), bindingContext); 

    controller.ModelState.Clear(); 
    controller.ModelState.Merge(bindingContext.ModelState); 

    var result = controller.ChampsFormulaireInvalidite(model); 

    Assert.AreEqual(false, controller.ModelState.IsValid); 
}