1

Django には、 HTTP 応答 (ステータス コード、コンテキスト/モデル データなど) の正確性を検証するためにテスト ケースで使用できる、非常に便利なテスト クライアント/ダミー Web ブラウザーがあります。フレームワークを直接処理して呼び出しをシミュレートするため、Web サーバーを実行する必要はありません。

テスト スイートにすぐに組み込むことができる nUnit (または同様の) 同等物が本当に欲しいです。私たちは MVC3 と 4 で作業しており、301 リダイレクトの成功、モデルの検証が正しいこと、ViewModel データがビューで正しいことなどを確認したいと考えています。

これに対する最善の解決策は何ですか?

4

2 に答える 2

1

ViewModel データは、次の方法で簡単に確認できます。

    public T GetViewModelFromResult<T>(ActionResult result) where T : class
    {
        Assert.IsInstanceOf<ViewResult>(result);
        var model = ((ViewResult)result).Model;
        Assert.IsInstanceOf<T>(model);
        return model as T;
    }

    [Test]
    public void TheModelHasTheOrder()
    {
        var controller = new MyController();
        var result = controller.MyActionMethod();
        var model = GetViewModelFromResult<MyModel>();

        Assert.That(model, Is.SameAs(???));
    }

モデルの検証に関しては、[Required] などのすぐに使用できる .net プロパティ属性を使用している場合、それらが正常に機能し、テストを必要としないことを確信できます。

于 2012-08-03T13:47:33.237 に答える
0

オブジェクトの [Required] などの属性を明示的にテストするには、組み込みの .net 検証を別のクラスに抽出する必要があります。次に、コントローラーの Model.IsValid プロパティの代わりに、コントローラーでそのクラスを使用してオブジェクトを検証します。

モデル バリデータ クラス:

public class ModelValidator : IModelValidator
{
    public bool IsValid(object entity)
    {
        return Validate(entity, new List<ValidationResult>());
    }

    public IEnumerable<ValidationResult> Validate(object entity)
    {
        var validationResults = new List<ValidationResult>();
        Validate(entity, validationResults);
        return validationResults;
    }

    private static bool Validate(object entity, ICollection<ValidationResult> validationResults)
    {
        if (entity != null)
        {
            var validationContext = new ValidationContext(entity, null, null);
            return Validator.TryValidateObject(entity, validationContext, validationResults);    
        }

        return false;
    }
}

これは、次の単体テストで検証できます。

public class MySampleEntity
{
    [Required]
    public string X { get; set; }

    [Required]
    public int Y { get; set; }
}

[TestFixture]
public class ModelValidatorTests
{
    [Test]
    public void GivenThePropertiesArePopulatedTheModelIsValid()
    {
        // arrange
        var _validator = new ModelValidator();
        var _entity = new MySampleEntity { X = "ABC", Y = 50 };

        // act
        var _result = _validator.IsValid(_entity);

        // assert
        Assert.That(_result, Is.True);
    }
}
于 2012-08-03T16:12:20.113 に答える