Hoe om toegang te verkry klasse in 'n ander gemeente vir-eenheid toets doeleindes?
-
06-07-2019 - |
Vra
Ek spring in eenheid-toets van die Visual-Studio 2008 manier, en ek wonder wat is die beste manier om kruis-vergadering class
toegang vir toetsdoeleindes bereik.
Eintlik, ek het twee projekte in een oplossing:
- MyProject (C #)
- MyProjectTests (C # Toets Projek)
Alles in MyProject het tans verstek toeganklikheid, wat korrek as ek reg onthou, beteken alles is effektief internal
. Ek is meestal op soek na toets teen die class
vlak, maar daar is 'n paar delegates
betrokke.
Daar sal waarskynlik 'n eksterne API wees iewers in die toekoms, maar ek is sowat 20% van die manier om funksievolledige (ten minste op papier) en ek raak redelik handig van gelaagdheid meer kode op die top van hierdie ongetoets kern. Gevolglik wil ek graag 'n paar toets nou gedoen het, voordat die app is volledige genoeg vir tradisionele (lees: sleg en / of lui). Funksionele toetsing en beslis voor die weergawe N + 1 eksterne API is up
In bykomend tot 'n reguit antwoord, 'n voorbeeld van die oplossing sal waardeer word.
Oplossing
Jy kan gebruik vergadering-vlak kenmerk InternalsVisibleToAttribute 'n> om dit te bereik.
Voeg by
[assembly:InternalsVisibleTo("MyProjectTests")]
om AssemblyInfo.cs in jou MyProject vergadering.
Ander wenke
Jy kan dit toets interne metodes, deur die toevoeging van 'n kenmerk van die AssemblyInfo.cs vir jou hoof projek, wat toegang gee tot die interne metodes om 'n naam van die gemeente:
[vergadering: InternalsVisibleTo ( "MyProjectTestsNameSpace.MyProjectTests")]
Verdere inligting is hier
Jy moet voeg
[assembly:InternalsVisibleTo("Unit.Tests.Assembly")]
om AssemblyInfo.cs van jou "MyProject (C #)". Wat dit moontlik maak dan jou toetse om toegang te verkry tot die interne metodes vir die toets.
Dit lyk of jy moet die InternalsVisibleToAttribute
Maar ek wil aanbeveel teen hierdie benadering -. Toets jou interne klasse via die openbare koppelvlak of API
Hoewel [InternalsVisibleTo]
is die mees sinvolle manier IMO, is daar ten minste 2 ander maniere om te gaan oor weet:
-
Deur die gebruik van Refleksie 'n>
var method = instance.GetType().GetMethod( methodName, BindingFlags.NonPublic | BindingFlags.Instance, null, paramTypeArray, null); return method.Invoke(instance, parameters);
Die probleem met hierdie benadering is dat as die metode naam of handtekening veranderinge, sal die eenheid toets begin versuim te hardloop tyd, terwyl [InternalsVisibleTo]
sou maklik opgetel hierdie breaking verandering tydens kompilering.
- Gebruik 'n toets raamwerk soos
Moles / Fakes
ofTypeMock
Ek het gevind dat hierdie een https://msdn.microsoft.com/en -us / library / hh598957.aspx Hoop dit kan help om iemand.
Opsomming:
- In jou eenheid toets projek, voeg 'n verwysing na die kode onder toets. Hier is hoe om die verwysing na 'n kode projek in dieselfde oplossing te skep:
- Kies die projek in Oplossing Explorer.
- Op die spyskaart Projek, kies Voeg Reference ....
- In die dialoog Reference Manager boks, maak die Oplossing knoop en kies Projekte.
- Gaan die naam kode projek en sluit die dialoog.