こんにちは私は可能な設計上の欠陥があり、拡張メソッドで解決する必要があります。 クラスがあり、StringCollectionのプロパティを持っているとします。例コードスタックトレースから呼び出し元オブジェクトにアクセスし、そのプロパティを設定することは可能ですか?
public class MyProblematicClass
{
public IDbAccess Db{get;set;}
public StringCollection Errors{get;set;}
public MyProblematicClass(IDbAcces db){ Db=db;}
public int SetItem(Item i)
{
var id = Db.Save(i);
this.Errors = Db.Erros;
return id;
}
}
私の行っていることは、私のユニットテストクラスではIDBAccessを模擬しています。このクラスは、属性に従ってオブジェクトを検証します。何らかのエラーが発生してもdbにヒットしなかった場合、それは独自のErrorsコレクションを埋めています。単体テストでは、検証ルーチンを実行する別のdbclassを使用します。ここではエラーが発生しません。私は(私は設計に問題があるけど、今のところ、私は何も変更せずにそれに対処したい)私のユニットテストで
public static class MyDbExtension
{
public static Save(Item i)
{
Validation v = new Validation();
var erros = v.ValidateObject(i);
//Here is problem i cannot pass it to MyProblematicClass
if (errors.Count > 0)
return -1;
else
return 1;
/* what I want to is :
var stackTrace = new StackTrace(); get stack trace
var object = stackTrace.GetFrame(1).GetMethod().GetObject() or sth like that. get object
object.GetProperties()[0].SetValue(object,errors,null); find property and set it.
*/
}
}
さらに理解するためにあなたに例を挙げてみましょう:私が欲しいもの
public class UnitTest
{
Mock<IDbAccess> _db ;
MyProblematicClass _mpc;
pubic Setup()
{
_db.Setup(x=>x.Save(It.IsAny<Item>).Returns(u =>MyDbExtension.Save(u));
_mpc = new MyProblematicClass(_db.Object);
}
public void SetItem_EmptyObject_Contains3Erros()
{
Item i = new Item();
_mpc.SetItem(i);
//At this point i cannot set _mpc.Errors
}
達成するために私のDbExtensionクラスでは、呼び出し側のクラスにアクセスし、そのErrorsプロパティを設定できますか?私は試しましたが、それはまだありませんでした。誰かがまともな解決策を持っていれば、私は感謝し、もちろんあなたは設計上の問題にコメントすることができます。
編集
私は彼がちょうどちょうどErros特性を模擬し、それがOKになりますSaveメソッドを無視したアレックスの答えを感謝しています。それは理にかなっていますが、私が疑問に思っているのは、Stack Traceにアクセスして、呼び出し元メソッドのオブジェクトのプロパティを操作できるかどうかです。
ありがとうございます。なぜあなたは、保存のための静的メソッドを使用している、私は私は本当にあなたのデザインに従わない認めなければならない
public class UnitTest
{
Mock<IDbAccess> _db ;
MyProblematicClass _mpc;
StringCollection errors;
pubic Setup()
{
_db.Setup(x=>x.Save(It.IsAny<Item>).Returns(u =>MyDbExtension.Save(u));
_db.Setup(x=>x.Errors).Returns(errors);
_mpc = new MyProblematicClass(_db.Object);
}
public void SetItem_EmptyObject_ContainsError()
{
errors.Add("Expected Error!");
Item i = new Item();
_mpc.SetItem(i);
Assert.AreEqual("Expected Error!", _mpc.Errors[0]);
}
}
:
静的理由この保存はIRepositoryのsaveメソッド。だから私は誰も毎回セーブメソッドを実装したくない。それは非常にまっすぐ前方に検証し、dbに保存します。私は擬似でErrosを設定することができますが、私はそれを検証したいとコレクションに満ちている必要があります。私はこの質問の文脈からスタックトレースを使うことができるのだろうかと思います。 – adt
アレックス私は私の質問を編集してくれてありがとう、なぜ私はdidntがErrossを嘲笑すると思うか警告するためにありがとう:)とにかく私は答えるだろうが、正確に私は何を求めている。 – adt