2017-07-17 2 views
1

J'essaye d'écrire des tests unitaires pour un ListView avec un DataTemplate personnalisé. Bien que les cellules soient affichées comme prévu sur iOS et Android, leurs propriétés liées sont null lors de l'exécution de tests NUnit.Test NUnit pour Xamarin.Forms ListViews avec liaison de cellule

La configuration

Pour lancer Xamarin.Forms dans un projet de test NUnit, j'utilise Xamarin.Forms.Mocks. Ainsi, le TestFixture se présente comme suit:

using NUnit.Framework; 
using Xamarin.Forms; 
using Xamarin.Forms.Mocks; 

namespace UnitTest 
{ 
    [TestFixture] 
    public class Test 
    { 
     [SetUp] 
     public void SetUp() 
     { 
      MockForms.Init(); 
     } 

Ce qui fonctionne

Un test qui fonctionne bien, crée une nouvelle DataTemplate avec une coutume StringCell lié à une chaîne "foo":

 class StringCell : ViewCell 
     { 
      public StringCell() 
      { 
       var label = new Label(); 
       label.SetBinding(Label.TextProperty, "."); 
       View = label; 
      } 
     } 

     [Test] 
     public void ViewCellWithString() 
     { 
      var content = new DataTemplate(typeof(StringCell)).CreateContent(); 
      (content as Cell).BindingContext = "foo"; 

      Assert.That(((content as ViewCell).View as Label).Text, Is.EqualTo("foo")); 
     } 

Comme prévu, le rendu content est un ViewCell avec un View de type Label h le Text "foo".

Qu'est-ce qui ne fonctionne pas

Cependant, un second test, échoue: Il crée un DataTemplate de type ItemCell lié à un objet personnalisé Item avec une propriété liable Name "bar".

 class Item : BindableObject 
     { 
      public static readonly BindableProperty NameProperty = BindableProperty.Create(nameof(Name), typeof(string), typeof(Item), null); 

      public string Name { 
       get { return (string)GetValue(NameProperty); } 
       set { SetValue(NameProperty, value); } 
      } 
     } 

     class ItemCell : ViewCell 
     { 
      public ItemCell() 
      { 
       var label = new Label(); 
       label.SetBinding(Label.TextProperty, nameof(Item.NameProperty)); 
       View = label; 
      } 
     } 

     [Test] 
     public void ViewCellWithItem() 
     { 
      var content = new DataTemplate(typeof(ItemCell)).CreateContent(); 
      (content as Cell).BindingContext = new Item { Name = "bar" }; 

      Assert.That(((content as ViewCell).View as Label).Text, Is.EqualTo("bar")); 
     } 

Ce test échoue, parce Text propriété est null du label.

Ma question

Qu'est-ce que je fais mal? La liaison à une chaîne via "." ne devrait-elle pas se comporter de la même façon que la liaison à Item via NameProperty? Ou existe-t-il un meilleur moyen d'instancier l'affichage d'une cellule de liste avec des propriétés de liaison à des fins de test unitaire?

Répondre

0

Je viens de découvrir l'erreur minuscule mais crucial dans mon code:

Au lieu de

label.SetBinding(Label.TextProperty, nameof(Item.NameProperty)); 

Je dois écrire

label.SetBinding(Label.TextProperty, nameof(Item.Name)); 

depuis nameof(Item.NameProperty) rendements "NameProperty", mais je dois pour lier à "Nom".