Vraag Hoe een venster programmatisch te instantiëren of bespotten?


Voor sommige van mijn unit tests moet ik methoden aanroepen die een Window als parameter vereisen. Helaas kan ik null niet doorgeven, omdat de methode het venster gebruikt als een verwijzing naar de statusbalk waar ik laat zien wat er daadwerkelijk in de echte applicatie is geladen.

Dus probeerde ik de constructeur te bellen in de eenheidscontrole:

MainWindow-venster = nieuw MainWindow ();

Maar dit resulteert in de volgende fout in de methode InitializeComponent van de hoofdvenstercomparator:

System.Windows.Markup.XamlParseException occurred
  Message='Provide value on 'System.Windows.Baml2006.TypeConverterMarkupExtension' threw an exception.' Line number '9' and line position '42'.
  Source=PresentationFramework
  LineNumber=9
  LinePosition=42
  StackTrace:
       at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
  InnerException: System.IO.IOException
       Message=Assembly.GetEntryAssembly() returns null. Set the Application.ResourceAssembly property or use the pack://application:,,,/assemblyname;component/ syntax to specify the assembly to load the resource from.
       Source=PresentationFramework
       StackTrace:
            at MS.Internal.AppModel.ResourceContainer.GetResourceManagerWrapper(Uri uri, String& partName, Boolean& isContentFile)
            at MS.Internal.AppModel.ResourceContainer.GetPartCore(Uri uri)
            at System.IO.Packaging.Package.GetPartHelper(Uri partUri)
            at System.IO.Packaging.Package.GetPart(Uri partUri)
            at System.IO.Packaging.PackWebResponse.CachedResponse.GetResponseStream()
            at System.IO.Packaging.PackWebResponse.GetResponseStream()
            at System.IO.Packaging.PackWebResponse.get_ContentType()
            at System.Windows.Media.Imaging.BitmapDecoder.SetupDecoderFromUriOrStream(Uri uri, Stream stream, BitmapCacheOption cacheOption, Guid& clsId, Boolean& isOriginalWritable, Stream& uriStream, UnmanagedMemoryStream& unmanagedMemoryStream, SafeFileHandle& safeFilehandle)
            at System.Windows.Media.Imaging.BitmapDecoder.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy, Boolean insertInDecoderCache)
            at System.Windows.Media.Imaging.BitmapFrame.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy)
            at System.Windows.Media.ImageSourceConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
            at System.Windows.Baml2006.TypeConverterMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
            at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue(MarkupExtension me, IServiceProvider serviceProvider)
       InnerException: 

Dus mijn vraag is, hoe kan ik een venster in eenheidstesten een spot of een spot geven?


10
2018-03-31 17:22


oorsprong


antwoorden:


Probeer het volgende:

if(Application.ResourceAssembly == null)
    Application.ResourceAssembly = typeof(MainWindow).Assembly;
var window = new MainWindow();

18
2018-03-31 17:31



Kort antwoord is dat je dat niet zou moeten doen. Eenheidstesten is niet gedaan op UI.

Unit-tests moeten worden uitgevoerd op uw logische code, en dat is waar patronen als MVC en MVVM komen helpen. De gebruikersinterface moet worden getest met behulp van hulpmiddelen zoals CodedUI.

als je logica afhankelijk is van de gebruikersinterface, doe je het verkeerd.


3
2018-03-31 17:32