testfx: PrivateObject and PrivateType are not available for a project targeting netcorapp2.0

Description

Currently the classes located at Microsoft.VisualStudio.QualityTools.UnitTestFramework.PrivateObject and Microsoft.VisualStudio.QualityTools.UnitTestFramework.PrivateType are only available in the /src/TestFramework/Extension.Desktop/ project, this made sense in the past because the other project types did not support the System.Reflection classes necessary to implement those two classes.

However, as of netcoreapp2.0 those projects projects have access to all the needed classes in System.Reflection. A new Extension.CoreApp project should be built, or the existing Extension.Desktop project should be moved to the new VS15 style of projects so that <targetframeworks>netcoreapp2.0;net45</targetframeworks> could be set.

Steps to reproduce

  • Create a new test project targeting netcoreapp2.0
  • Try to use the class PrivateObject

Expected behavior

PrivateObject is found and is useable

Actual behavior

PrivateObject is not available for projects referencing the assembly that was generated from Extensions.Core

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Reactions: 40
  • Comments: 22 (1 by maintainers)

Commits related to this issue

Most upvoted comments

Personally I am glad that this hasn’t been added to .NET Core / Standard. Testing of private stuff is an anti-pattern and should be avoided. However, if you absolutely cannot live without it (are doing migration of legacy stuff into .NET Core / Standard etc.), you could implement is yourself: https://gist.github.com/skalinets/1c4e5dbb4e86bd72bf491675901de5ad

We discussed this internally and decided that we don’t want to introduce this pattern back into the framework.

In the attached zip file there is a single .cs that can be dropped into your test project, or a shared class library and is netstandard 2.0 compatible. The source code is a copy of this implementation.

PrivateObjectPrivateType.zip

Just wanted to chime in that this would be a great addition to the testing framework.

Oh, my god. Today I googling a lot, before I found this issue, that it is a known bug. But known bug for more than 8 months? Please add this functionality to .Net core tests also!

The following documentation has not been updated to state that PrivateObject and PrivateType is not available on .Net/Net Core projects:

Can this be updated to avoid future confusion for other devs reading Microsoft documentation?

If this is not going to be available for the netcore, please update the documentation accordingly.

I wrote a small extension method which enables you to call private methods 🎉 Have a look at the sample code:

class Test
{
  private string GetStr(string x, int y) => $"Success! {x} {y}";
}

var test = new Test();
var res = test.Invoke<string>("GetStr", "testparam", 123);
Console.WriteLine(res); // "Success! testparam 123"

You can find the code here: https://gist.github.com/xpl0t/0d223222696a1c92d7d23cf8368800bf

You guys can copy the codes into your project at the moment. I’m personally using my own wrapper extension methods for PrivateObject and PrivateType, which depends on copied codes so that my NuGet package can be used on any environment (for MSTest V1/2 on .NET Framework and for MSTest/NUnit/xUnit on .NET Core). https://github.com/cactuaroid/PrivateObjectExtensions/tree/master/PrivateObjectExtensions/testfx

@skalinets IMO, these types are not mainly used for private invoke but for mocking.