2015-03-10 3 views
2

Я пытаюсь написать единичный тест для метода, который имеет параметры. Мой метод - это метод TryParse для моего пользовательского объекта. Я использую .NET 4.5/5 с Visual Studio 2013. Это позволяет мне полностью реализовать частные/внутренние и статические объекты, используя объект PrivateType. Единственное, что, кажется, ускользнуло от меня, - это проверить параметр out, поскольку я не могу использовать это ключевое слово в методе InvokeStatic. Я ищу подходящее решение для тестирования этого архитектурного проекта.Как проверить метод с параметрами 'out'?

Использование для TryParse является частью процесса TypeConverter, как описано в WebAPI Parameter Binding post By Mike Wilson

public class MyFilter 
{ 
    public string Field { get; set; } 
    //... removed for brevity 

    internal static bool TryParse(string sourceValue, out MyFilter filter) 
    { 
     //... removed for brevity 
    } 
} 

public class MyFilterTests 
{ 
    [TestMethod] 
    [TestCategory("TryParse")] 
    public void TryParseWithTitleOnly() 
    { 
     var stringSource = "{field:'DATE.FIELD'}"; 

     MyFilter tryParseOut = null; 

     var target = new PrivateType(typeof(MyFilter)); 

     var tryParseReturn = target.InvokeStatic("TryParse", stringSource, tryParseOut); 

     var expectedOut = new MyFilter() 
     { 
      Field = "DATE.FIELD" 
     }; 

     Assert.IsTrue((bool)tryParseReturn); 
     Assert.AreEqual(expectedOut, tryParseOut); 
    } 
} 
+0

И TryParse должен быть внутренним? – Juan

+0

Поскольку архитектурное проектирование ограничивает доступ к свойствам, которые не нужны снаружи (разделение внимания). Это заставляет наших разработчиков использовать правильные шаблоны кодирования при работе с объектами данных. – itanex

ответ

6

Лично я хотел бы использовать InternalsVisibleTo для того, чтобы сделать метод видимым для вашего тестового кода, но если вы сделать хотите использовать PrivateType, я бы ожидать, чтобы вы могли просто создать object[] который вы сохраняете ссылку, передать его в InvokeStatic, а затем получить значение снова:

object[] args = new object[] { stringSource, null }; 
var tryParseReturn = target.InvokeStatic("TryParse", args); 

... 

// args[1] will have the value assigned to the out parameter 
Assert.AreEqual(expectedOut, args[1]); 

По крайней мере, я бы ожидал, что для работы - это то, как отражение в целом обрабатывает параметры ref и out.

+0

'args' не передается' InvokeStatic' или мне что-то не хватает? – haim770

+0

@ haim770: Моя ошибка - исправлено сейчас, спасибо :) –

+0

@ haim770 У InvokeStatic есть несколько интерфейсов, которые я пытаюсь использовать в этом сценарии, задокументированы здесь. https://msdn.microsoft.com/en-us/library/ms244026.aspx – itanex