2016-11-05 1 views
1

J'ai eu une série de scénarios qui ressemblent à ceci:Specflow - Scénario outilne avec table de données

Given these receipts: 
| Amount | Date  | Company   | 
| 1000 | 2016/10/25 | One Company  | 
| 1200 | 2016/10/20 | Another Company | 
| 1500 | 2016/10/13 | My Company  | 
And delay is 15 
When I calculate date of payment 
Then Date of payment should be 20 

Given these receipts: 
| Amount | Date  | Company   | 
| 1000 | 2016/10/25 | One Company  | 
| 1200 | 2016/10/20 | Another Company | 
| 1500 | 2016/10/13 | My Company  | 
And delay is 30 
When I calculate date of payment 
Then Date of payment should be 15 

Given these receipts: 
| Amount | Date  | Company   | 
| 1000 | 2016/10/25 | One Company  | 
| 1200 | 2016/10/20 | Another Company | 
| 1500 | 2016/10/13 | My Company  | 
And delay is 45 
When I calculate date of payment 
Then Date of payment should be 10 

J'appris Scenario outline et j'ai essayé de faire un pour les scénarios ci-dessus, mais avait du mal à mettre dans les recettes pour des raisons évidentes:

Given these receipts: '<receipts>' 
And delay is <delay> 
When I calculate date of payment 
Then Date of payment should be '<dateOfPayment>' 

Examples: 
| delay | dateOfPayment | receipts        | 
| 15 | 20   | | Amount | Date  | Company  | | 
         | | 1000 | 2016/10/25 | one company | | 
         | | .............................. | | 

Given que je veux la même collection de, dans ce cas, receipts pour tous scenarios dans mon Feature comment puis-je déclarer une table qui sera passé à l'endroit de '<receipts>' dans le scenario outline

Peut-être, devrais-je procéder avec une approche différente?

---------------------------------- EDITED ----------- ---------------------

peut-être quelque chose comme ça pourrait fonctionner (mais il n'est pas mis en œuvre Gherkin):

Given these receipts: '<receipts>' 
And delay is <delay> 
When I calculate date of payment 
Then Date of payment should be '<dateOfPayment>' 

Examples: 
| delay | dateOfPayment | 
| 15 | 20   | 

Placeholder: '<receipts>' 
| Amount | Date  | Company   | 
| 1000 | 2016/10/25 | One Company  | 
| 1200 | 2016/10/20 | Another Company | 
| 1500 | 2016/10/13 | My Company  | 
+0

Si les données 'réceptibles' sont constantes d'un scénario à l'autre, vous devez les conserver dans les scénarios d'origine. Et mettez simplement le 'delay' et le 'dateOfPayment' dans les exemples de scénario. Mais si les données sur les recettes changent d'un scénario à l'autre, cela ne fonctionnerait pas.Quelle est la dépendance des trois entreprises dans le datatable? – Grasshopper

+0

société est seulement une information dans cet exemple, il pourrait être une autre date (date d'émission, date d'échéance). – sabotero

+0

@Grasshopper donc je dois répéter la table pour chaque scénario? Il semble que cela pourrait être factorisé d'une manière ou d'une autre, peut-être créer un autre scénario avec seulement un donné qui passe la table en paramètre. Peut-être quelque chose comme [this] (http://www.specflow.org/documentation/FeatureContext/) (sans utiliser le feturecontext qui est mentionné dans ce lien)? – sabotero

Répondre

2

J'ai eu cette idée stupide: Étant donné que les recettes ne change pas que je pourrais peut-être fournir au Scenario Outline un Administré avec la table réelle plutôt que d'un placeholder

Et cela a fonctionné:

Scenario Outline: payment 
Given these receipts: 
| Amount | Date  | Company   | 
| 1000 | 2016/10/25 | One Company  | 
| 1200 | 2016/10/20 | Another Company | 
| 1500 | 2016/10/13 | My Company  | 
And delay is '<delay>' 
When I calculate date of payment 
Then Date of payment should be '<dateOfPayment>' 

Examples: 
| delay | dateOfPayment | 
| 15 | 20   | 
| 30 | 10   | 
| 45 | 5    | 

Si vous êtes, comme je h, travaillant dans .Net avec Specflow et c# specflow va générer cette méthode pour la Given avec le table:

[Given(@"these receipts:")] 
public void GivenTheseReceipts() 
{    
    ScenarioContext.Current.Pending(); 
} 

Ne vous inquiétez pas, il suffit d'ajouter le paramètre table et le table sera passé en paramètre comme il le fait avec un scénario normal:

[Given(@"these receipts:")] 
public void GivenTheseReceipts(Table table) 
{ 
    var receipts = table.CreateSet<Receipt>(); // you can even create a set given you have defined the Receipt class 
} 

public class Receipt 
{ 
    public decimal Amount { get; set; } 
    public DateTime Date { get; set; } 
    public string Company { get; set; } 
} 

------------------------- EDITED ------------ -------------------------

Il semble que cela aurait aussi travaillé avec Background:

Background: 
Given these receipts: 
| Amount | Date  | Company   | 
| 1000 | 2016/10/25 | One Company  | 
| 1200 | 2016/10/20 | Another Company | 
| 1500 | 2016/10/13 | My Company  | 

Scenario Outline: payment 
And delay is '<delay>' 
When I calculate date of payment 
Then Date of payment should be '<dateOfPayment>' 

Examples: 
| delay | dateOfPayment | 
| 15 | 20   | 
| 30 | 10   | 
| 45 | 5    | 

Maintenant, il est seulement une question de style.

Notez également que Background sera appelé avant tous les autres scenarios que vous pouvez avoir dans votre fichier Feature.

+0

Ceci est Gherkin valide et fonctionnera avec Cucumber et SpecFlow. La table fait partie de la structure du scénario, elle sera donc la même pour chaque exemple. –

1

Scenario Outline-t ne supporte pas la substitution de table.

Vous pouvez toutefois utiliser:

| delay | dateOfPayment | rcpt1Amnt | rcpt1Date | rcpt1Cmpny | rcpt2Amnt | recpt2Date | ... | 15 | 20 | 1000 | 2016/10/25| One Company| 1200 | 2016/10/20 | ...

+0

Il pourrait être une solution, encore il répète la table dans chaque «exemple» et c'est ce que je veux éviter. – sabotero

+0

Veuillez vérifier ma réponse ci-dessous. Par curiosité cela fonctionne avec Cucumber-jvm? Avec Specflow, il fonctionne bien! – sabotero

+0

J'ai mal lu votre question originale @ Sabotero - votre solution est la bonne voie à suivre. –