PrivateObject в Visual Studio - PullRequest
       19

PrivateObject в Visual Studio

0 голосов
/ 05 февраля 2020

Я использую Visual Studio 2019 и в тестовом проекте MSTest (. NET Core) Я пытаюсь использовать PrivateObject для тестирования защищенного метода.

Например, я пытаюсь сделать что-то вроде следующего

PrivateObject private= new PrivateObject(new Color())

Но я получаю следующую ошибку

Не удалось найти PrivateObject, если вы пропустили директиву using или ссылку на сборку?

Я также включаю

using Microsoft.VisualStudio.TestTools.UnitTesting;

, который, как я думал, будет включать PrivateObject.

Есть идеи?

1 Ответ

1 голос
/ 05 февраля 2020

Я думаю PrivateObject не существует в. Net Ядро. Вы можете использовать эти расширения для вызова не публикуемых c членов.

public static T CallNonPublicMethod<T>(this object o, string methodName, params object[] args)
        {
            var type = o.GetType();
            var mi = type.GetMethod(methodName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

            if (mi != null)
            {
                return (T)mi.Invoke(o, args);
            }

            throw new Exception($"Method {methodName} does not exist on type {type.ToString()}");
        }

public static T CallNonPublicProperty<T>(this object o, string methodName)
        {
            var type = o.GetType();
            var mi = type.GetProperty(methodName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

            if (mi != null)
            {
                return (T)mi.GetValue(o);
            }

            throw new Exception($"Property {methodName} does not exist on type {type.ToString()}");
        }

И вы можете использовать их следующим образом:

var color= new Color();
var result= color.CallNonPublicMethod<YourReturnType>(YourMethodName, param1, param2, ... param n);
...