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?