2017-11-20 10 views
-1

Mein Testprojekt basiert auf dem BDD-Ansatz. Ich habe versucht, Methode über statische Variable aufzurufen. Aber etwas in meinen Handlungen ist falsch.Der Typ muss konvertierbar sein, falls generisches

Mein Code:

public class BasePage 
{ 
    public T As<T>() where T : BasePage 
    { 
     return (T)this; 
    } 
} 

public class PropertiesCollection 
{ 
    private static BasePage _currentPage; 

    public static BasePage currentPage 
    { 
     get { return _currentPage; } 
     set 
     { 
      ScenarioContext.Current["class"] = value; 
      _currentPage = ScenarioContext.Current.Get<BasePage>("class"); 
     } 
    } 
} 
public sealed class LoginSteps 
    {  
     [Given(@"I have navigated to my app")] 
     public void GivenIHaveNavigatedToMyApp() 
     {   Browser.Current.Navigate().GoToUrl(ConfigurationManager.AppSettings["seleniumBaseUrl"]); 
      PropertiesCollection.currentPage = new LoginPage(); 

     } 
     [Given(@"I typed the (.*) and (.*)")] 
     public void GivenITypedTheAnd(string username, string password) 
     { 
      var m = PropertiesCollection.currentPage.As<LoginPage>().Login(username, password); 
     } 

So in der letzten Codezeile I Fehlermeldung, zB um .Pages.BasePage“„Der Typ muss auf konvertierbar sein“in der generischen Methode als Parameter zu verwenden „.Pages.BasePage.As()“ Was soll ich fix ändern Sie es?

+0

Was ist die Definition von "LoginPage"? Verlängert es "BasePage"? – Lee

+0

Post LoginPage-Code auch. Warum benötigen Sie überhaupt eine private statische BasePage _currentPage? – unickq

+0

Was ist der Punkt der öffentlichen T As () wo T: BasePage? Die Verwendung würde als 'myBasePage.As ()' enden, während 'myObject als DerivedPage' bereits in C# verfügbar ist ... Außerdem ist Ihre Version eine Hardcast, die Exceptions auslöst, während die vorhandene 'as'-Implementierung einfach zurückkehrt Null. – Flater

Antwort

0

es ist eine Art unmöglich Ihr Problem ohne vollständigen Code zu verstehen, aber lassen Sie mich Ihnen ein Beispiel zeigen, wie sie umgesetzt werden könnten.

public class Core 
{ 
    protected CorePage CurrentPage 
    { 
     get 
     { 
      return ScenarioContext.Current.Get<CorePage>("CurrentPage"; 
     } 
     set 
     { 
      ScenarioContext.Current["CurrentPage"] = value; 
     } 
    } 

    public TPage InstanceOf<TPage>() where TPage : CorePage, new() 
    { 
     return new TPage(); 
    } 

    public TPage As<TPage>() where TPage : CorePage 
    { 
     return (TPage) this; 
    } 
} 

public class CorePage : Core 
{ 
    //Base page class 
} 

public class HomePage : CorePage 
{ 
    public void OpenLogin() 
    { 
     //Code 
     CurrentPage = new LoginPage(); 
    } 
} 

public class LoginPage : CorePage 
{ 
    public void Something() 
    { 
     //Code 
    } 
} 

[Binding] 
public class Step : Core 
{ 
    [Given(@"1st step")] 
    public void BlaBlaBla1() 
    {    
     CurrentPage.InstanceOf<HomePage>().OpenLogin(); 
    } 

    [Then(@"2nd step")] 
    public void BlaBlaBla2() 
    { 
     CurrentPage.As<LoginPage>().Something(); 
    } 
} 
Verwandte Themen