Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to test internal class library?

I would like to write a class library which creates for me a complex object but should only be exposed as little as possible. I want it to be included into other projects and there I only have one call to this library which e.g. returns me an object of a internally created class. I don't want to allow others to create these objects explicitly, but still I want to create a test project for this class library.

For example:

var result = Manager.Instance.Create(definition) 

This should be the only access to the class library.

Based on the definition parameter it uses different sub classes to create the requested instance and sets its properties accordingly. Therefore I want to assure somehow by tests that the whole creation process worked fine. But since I also don't want to expose very little internal properties of the result object too I cannot test by only using this public access method since I don't have any properties to assert on.

I know that you should not test for internal mechanics and it is typically bad design and I also was reading through this article, but isn't there maybe any way to create a library plus unit test project and maybe afterwards limit the access to this class? with a wrapper or something?

like image 229
Thomas Mondel Avatar asked Mar 15 '13 19:03

Thomas Mondel


People also ask

Should I test internal classes?

You should unit test internal classes that provide shared functionality - some classes in your library provide a place for shared code. Although they will be tested indirectly through classes using them, an additional direct testing lets you distinguish between problems with the class itself vs.

How do you run a class library?

Right-click on the solution in Solution Explorer and select Add > New Project. On the Add a new project page, enter library in the search box. Choose C# or Visual Basic from the Language list, and then choose All platforms from the Platform list. Choose the Class Library template, and then choose Next.


1 Answers

In .NET, you can use the InternalsVisibleToAttribute in your class library to make your internal types visible to your unit test project.

That way, you can keep your class internal and still use it from other assemblies that you give access.

You use it like this:

[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")] 
like image 57
Wouter de Kort Avatar answered Sep 21 '22 06:09

Wouter de Kort