Привет У меня есть возможный недостаток дизайна, и мне нужно решить его с помощью метода расширения.
Допустим, у меня есть класс, и у него есть свойство 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. Этот класс проверяет объект в соответствии с атрибутами. Если возникает какая-либо ошибка, она не попадает в базу данных, она просто заполняет собственную коллекцию ошибок. Для модульного теста я использую другой 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? Я пытался, но это вряд ли было еще. Если у кого-нибудь найдется достойное решение, я буду признателен, и, конечно, вы сможете прокомментировать проблемы с дизайном.
Редактировать
Я ценю ответ Алекса, он только что сказал: игнорируй метод Save, просто смейся над свойством Erros, и все будет в порядке. Это имеет смысл, но я задаюсь вопросом: возможно ли получить доступ к Stack Trace и манипулировать свойством объекта метода методов вызова?
Заранее спасибо.