Moqに切り替えて問題が発生しました。私は、ビジネスオブジェクトの新しいインスタンスを作成し、ユーザーの入力値からオブジェクトのプロパティを設定し、新しいオブジェクトを保存するメソッド(SaveCustomerContact)を呼び出すメソッドをテストしています。ビジネス・オブジェクトは、リモート・レイヤーを通過するため、ref引数として渡されます。私は、SaveCustomerContactに渡されるオブジェクトが期待どおりに設定されたすべてのプロパティを持っていることをテストする必要がありますが、コントローラメソッドで新しいものとしてインスタンス化されるため、そうすることはできません。Moqで参照パラメータの値を確認する
[TestMethod()]
public void AddContactTest() {
int customerId = 0;
string name = "a";
var actual = new CustomerContact();
var expected = new CustomerContact() {
CustomerId = customerId,
Name = name
};
model.Setup(m => m.CustomerId).Returns(customerId);
model.SetupProperty(m => model.CustomerContactName, name);
model.SetupProperty(m => m.PhoneNumber, string.Empty);
model.SetupProperty(m => m.FaxNumber, string.Empty);
model.SetupProperty(m => m.Email, string.Empty);
model.SetupProperty(m => m.ReceiveInvoiceFlag, false);
model.SetupProperty(m => m.ReceiveStatementFlag, false);
model.SetupProperty(m => m.ReceiveContractFlag, false);
model.SetupProperty(m => m.EmailFlag, false);
model.SetupProperty(m => m.FaxFlag, false);
model.SetupProperty(m => m.PostalMailFlag, false);
model.SetupProperty(m => m.CustomerLocationId, 0);
remote
.Setup(r => r.SaveCustomerContact(ref actual))
.Callback(() => Assert.AreEqual(actual, expected));
target.AddContact();
}
これは、そのパラメータのネタを取得するための多くの試みのちょうど最も最近のものである:
public void AddContact() {
var contact = new CustomerContact() { CustomerId = m_model.CustomerId };
contact.Name = m_model.CustomerContactName;
contact.PhoneNumber = m_model.PhoneNumber;
contact.FaxNumber = m_model.FaxNumber;
contact.Email = m_model.Email;
contact.ReceiveInvoiceFlag = m_model.ReceiveInvoiceFlag;
contact.ReceiveStatementFlag = m_model.ReceiveStatementFlag;
contact.ReceiveContractFlag = m_model.ReceiveContractFlag;
contact.EmailFlag = m_model.EmailFlag;
contact.FaxFlag = m_model.FaxFlag;
contact.PostalMailFlag = m_model.PostalMailFlag;
contact.CustomerLocationId = m_model.CustomerLocationId;
RemotingHandler.SaveCustomerContact(ref contact);
}
は、ここでのテストです。参考までに、実際の値は初期状態から変更されません。
ターゲット呼び出しが失敗した後にAssert.AreEqual(expected、actual)を移動します。 .CallBackの代わりに.Verifiable()を追加し、ターゲットの後ろにremote.Verifyを呼び出すと(あるいは、厳密にモックを設定すると仮定します)、テストで提供するパラメータがコントローラメソッドで作成されたインスタンスと同じインスタンス。
私はMoq 3.0.308.2を使用しています。これをテストする方法に関するアイデアは高く評価されます。ありがとう!
私はあなたがこのスタブをどのようにしているかわからないと思いますが(スタブについてはあまり知らないですが)。それがどのように扱われるかについて詳しく説明できますか? –
また、私がrefの問題に同意するのと同じくらい、リモートレイヤが動作する方法であり、テストをより簡単に書くことができるように、バックエンドのランダムなビットをラップする前例を開始するのは嫌です。 –
私は同様の問題を抱えていましたが、MoQの仕事をする上でゼロになってしまったので、私は自分のスタブを書くことができなかったことを忘れてしまいました!ありがとうございました。 –