私はこのC#の世界で非常に初心者です。C#MVCモデルは、ユニットテストコントローラアクションのときに常に有効です
このモデルクラスがあります:
public class Fund
{
[Required]
public int id { get; set; }
[Required]
public string name { get; set; }
[Required]
public string nickname { get; set; }
}
[Required]
注釈がすべてのプロパティを介してではあるが、同様のインスタンス:
if (ModelState.IsValid)
{
// do stuff
}
:
Fund f = new Fund();
f.name = "test name";
f.nickname = "test ninckname";
はいつものように、テストに合格
モデルを設定して、そのようなインスタンスがiで渡されないようにするにはどうすればいいですか? n ModelState.IsValid
テスト?以下のような
その他の事例:
Fund f1 = new Fund();
f1.id = 3;
f1.nickname = "test ninckname";
と
Fund f2 = new Fund();
f2.id = 3;
f2.name = "test name";
は、テストに合格しています。
EDIT:
ModelState.IsValid
は、コントローラ内部で、私は実際にコントローラをテストしています。
EDIT 2:コントローラのメソッドシグネチャである
:
[HttpPatch]
public ActionResult EditFund(Fund fund)
EDIT 3:
[TestMethod]
public void TestEditInvalidFund()
{
// Arrange
FundController controller = new FundController();
controller.ControllerContext = TestModelHelper.AdminControllerContext();
var _fund = new Mock<IFund>();
_fund.SetupGet(f => f.id).Returns(1);
//_fund.SetupGet(f => f.name).Returns("Fund name");
_fund.SetupGet(f => f.nickname).Returns("Fund nickname");
_fund.Setup(f => f.Edit()).Callback(() => {}).Verifiable();
// Act
var result = (JsonResult)controller.EditFund(_fund.Object);
// Assert
SimpleMessage resultMessage = m_serializer.Deserialize<SimpleMessage>(m_serializer.Serialize(result.Data));
Assert.IsNotNull(resultMessage.status, "JSON record does not contain 'status' required property.");
Assert.IsTrue(resultMessage.status.Equals("fail"), "status must be 'fail'");
}
そして、それは次のようになります。私の全体の試験方法である コントローラ全体の方法:
[HttpPatch]
public ActionResult EditFund(IFund _fund)
{
try
{
if (ModelState.IsValid)
{
//_fund.Edit();
}
else
{
string error_messages = "";
foreach (var e in ModelState.Select(x => x.Value.Errors).Where(y => y.Count > 0).ToList())
{
error_messages += e[0].ErrorMessage + "\n";
}
throw new Exception(error_messages);
}
return MessageHelper(@Resources.Global.success, @Resources.Funds.success_editing_fund, "success");
}
catch (Exception err)
{
return ErrorHelper(@Resources.Global.error, @Resources.Funds.error_editing_fund, err.Message);
}
}
は、なぜあなたは第一例が有効でないと思うだろう - あなたは ''名 'の値を提供してきました'nickname'と' int'のデフォルトは '0'でも有効です。あなたがintに無効なものにしたいなら、それをヌル値にして '[Required]'属性を追加してください。 –
@ChrisFCarroll、コントローラーの中にあります。 –
コードスニペットはコントローラからのもので、ユニットテストをしようとしていますか? –