2

そのため、アプリケーションには、あるタイプを別のタイプにマップするレイヤーがありますobjectViewModelマッピングのタイプをモデル化することを考えてください。には、異なる名前のViewModelプロパティがあるか、モデルに存在しない可能性があります。また、その逆も同様です。

割り当てを比較してマッピングレイヤーをテストしたいだけでなく、異なるプロパティに対して何らかのソートエッジケース処理を提供できるようにします。理想的には、のすべてのプロパティがViewModelチェックされていない場合、テストは失敗します。

そのような獣がすでに存在するかどうか誰かが知っていますか?

public class CustomerViewModel
{
     // This is the same as CustomerModel.CustomerName, but the names differ
     public string Name { get; set; }
     public int ID { get; set; }
}

public class CustomerModel
{
     public string CustomerName { get; set; }
     public int ID { get; set; }
}

// Would auto test the properties that match automatically.  Additionaltest test for non matching.  Fails if all properties aren't tested
Assert.CompareObjects(customerViewModelInstance, customerModelInstance)
     .AdditionalTest("Name", "CustomerName")
     .AdditionalComplexText((viewModel, model) =>
           {
                // do some sort of a compare of complex objects.  Maybe the viewmodel has address fields, address1, address2 while the Model has an Address object with those fields.
           });

この背後にある原動力は、非常に大規模なアプリケーションのコードですべてのプロパティを手動でアサートする必要があるという困難な作業です。

4

1 に答える 1

2

.Equals()比較するようにオーバーライドしてからproperties

Assert.AreEqual Method (Object, Object)。下記を参照してください:

NUnit内の2つのオブジェクト間の同等性を比較します

モデル自体にそのようなことを実装したいと思うでしょう。

// useful class
public class MyStuff 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int MyValue { get; set; }

    public override int GetHashCode()
    {
        return Id;
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != typeof (MyStuff)) return false;

        var other = obj as MyStuff;

        return (other.Id == Id
            && other.MyValue == MyValue
            && other.Equals(other.Name, Name));
        // use .Equals() here to compare objects; == for Value types

        // alternative weak Equals() for value objects:
        // return (other.MyValue == MyValue && other.Equals(other.Name, Name) );
    }
}

編集: 振り返ってみると、ビューモデルとモデルにプロパティが重複していることはおそらく悪いパターンであり、テストの問題が非常に多い理由の1つであると判断しました。むしろ、ViewModelがモデルをラップできるようにする必要があります。

public class CustomerViewModel
{
    // This is the same as CustomerModel.CustomerName, but the names differ
    public CustomerModel CustomerModel { get; set; }

    pubiic CustomerViewModel()
    {
        CustomerModel = new CustomerModel();
    }
}

public class CustomerModel
{
     public string CustomerName { get; set; }
     public int ID { get; set; }
}

その時点で、.Equalsオーバーライドパターンを使用して同じモデルの新しいコピーと比較できるラップされたモデルがあるため、テストがはるかに簡単になります。結局のところ、「任意のモデルを任意のモデルと比較する」という魔法の弾丸を思い付くのは良い考えではなく、実用的でもないと思います。

于 2013-01-24T18:32:29.870 に答える