Быстрый вопрос по отражению в C # - PullRequest
0 голосов
/ 27 марта 2009

Я начинаю с идеи разработки, основанной на тестировании, и проваливаюсь, так как я нахожу, что знаю, каким будет тест, но я не могу понять, как его выполнить что я хочу. У меня есть свойство, которое имеет public getter и internal setter. Я хотел бы проверить функциональность, получив доступ к установщику internal из модульного теста, но я не могу понять, как это сделать. Вот тест:

    [Test()]
    public void HandleInput() {
        _requestType = _request.GetType();
        PropertyInfo propStdin =
            _requestType.GetProperty("StandardInput", BindingFlags.Public | BindingFlags.NonPublic);
        if(propStdin == null) {
            // Bug in the test.
            throw new Exception("There is a bug in the test. Reflection of stdin property returned null.");
        }
        MethodInfo setStdin = propStdin.GetSetMethod();

        // This will fail at the moment since nothing is here to make this happen.
        Assert.AreEqual("NewInputNewRequestInput", _request.StandardInput);
    }

Теперь проблема в том, что когда я запускаю тест, я получаю:

[mono-2.4] mbt@zest:~/Projects/StaffASAP/Test.FastCGI/bin/Debug$ nunit-console2 Test.FastCGI.dll
NUnit version 2.4.8
Copyright (C) 2002-2007 Charlie Poole.
Copyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov.
Copyright (C) 2000-2002 Philip Craig.
All Rights Reserved.

Runtime Environment - 
   OS Version: Unix 2.6.29.0
  CLR Version: 2.0.50727.1433 ( Mono 2.4 )

..F
Tests run: 2, Failures: 1, Not run: 0, Time: 0.111 seconds

Test Case Failures:
1) Test.FastCGI.tRequest.HandleInput : System.Exception : There is a bug in the test. Reflection of stdin property returned null.
at Test.FastCGI.tRequest.HandleInput () [0x00051] in /home/mbt/Projects/StaffASAP/Test.FastCGI/tRequest.cs:54
at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (object,object[],System.Exception&)
at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00057] in /media/disk/mono-2.4/sources/mono-2.4/mcs/class/corlib/System.Reflection/MonoMethod.cs:159

Итак, я должен пытаться получить доступ к свойству неправильно, но, глядя на документацию, я не знаю, что я делаю неправильно. Что я я делаю неправильно?

Ответы [ 3 ]

4 голосов
/ 27 марта 2009

Ты скучаешь | BindingFlags.Instance в вызове GetProperty (...)?

Однако было бы гораздо приятнее представить внутренние переменные тестовой программе через атрибут InternalsVisibleTo, так как вам не нужно полагаться на отражение, и рефакторинг будет распространяться, если тестовый проект является частью вашего решения в Visual Studio .

2 голосов
/ 27 марта 2009

Возможно, вы захотите посмотреть атрибут сборки InternalsVisibleTo:

[Y] вы можете предоставить внутренние методы / свойства / классы сборки "дружественной" сборке. Обычно внутренние компоненты доступны только для членов одной сборки и часто используются для скрытия «сантехнических» методов и классов утилит.

0 голосов
/ 27 марта 2009

Вот аналогичная статья о SO, которая имеет дело с юнит-тестами, внутренними членами и отражением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...