2012-11-01 27 views
5

Tôi đang sử dụng SpecFlow với Nunit và tôi đang cố gắng thiết lập các thử nghiệm môi trường của mình bằng cách sử dụng TestFixtureSetUpAttribute, nhưng nó không bao giờ được gọi.Luồng dữ liệu với NUnit không tôn trọng TestFixtureSetUpAttribute

Tôi đã cố gắng sử dụng thuộc tính MSTests và ClassInitialize, nhưng điều tương tự cũng xảy ra. Hàm không được gọi.

Mọi ý tưởng Tại sao?

[Binding] 
public class UsersCRUDSteps 
{ 
    [NUnit.Framework.TestFixtureSetUpAttribute()] 
    public virtual void TestInitialize() 
    { 
     // THIS FUNCTION IS NEVER CALLER 

     ObjectFactory.Initialize(x => 
     { 
      x.For<IDateTimeService>().Use<DateTimeService>(); 
     }); 

     throw new Exception("BBB"); 
    } 

    private string username, password; 

    [Given(@"I have entered username ""(.*)"" and password ""(.*)""")] 
    public void GivenIHaveEnteredUsernameAndPassword(string username, string password) 
    { 
     this.username = username; 
     this.password = password; 
    } 

    [When(@"I press register")] 
    public void WhenIPressRegister() 
    { 
    } 

    [Then(@"the result should be default account created")] 
    public void ThenTheResultShouldBeDefaultAccountCreated() 
    { 
    } 

Giải pháp:

[Binding] 
public class UsersCRUDSteps 
{ 
    [BeforeFeature] 
    public static void TestInitialize() 
    { 
     // THIS FUNCTION IS NEVER CALLER 

     ObjectFactory.Initialize(x => 
     { 
      x.For<IDateTimeService>().Use<DateTimeService>(); 
     }); 

     throw new Exception("BBB"); 
    } 

    private string username, password; 

    [Given(@"I have entered username ""(.*)"" and password ""(.*)""")] 
    public void GivenIHaveEnteredUsernameAndPassword(string username, string password) 
    { 
     this.username = username; 
     this.password = password; 
    } 

    [When(@"I press register")] 
    public void WhenIPressRegister() 
    { 
    } 

    [Then(@"the result should be default account created")] 
    public void ThenTheResultShouldBeDefaultAccountCreated() 
    { 
    } 

Trả lời

6

bạn TestInitialize không được gọi vì nó nằm bên trong lớp bước của bạn và không phải bên trong một Unit Tests (vì đơn vị kiểm tra thực tế là bên trong .cs được tạo ra từ của bạn .feature tệp).

SpecFlow có nó sự kiện thử nghiệm đời riêng mà được gọi là lưỡi câu, đây là tất cả các móc được xác định trước:

  • [BeforeTestRun]/[AfterTestRun]
  • [BeforeFeature]/[AfterFeature]
  • [BeforeScenario]/[AfterScenario]
  • [BeforeScenarioBlock]/[AfterScenarioBlock]
  • [BeforeStep]/[AfterStep]

Lưu ý rằng điều này cho phép thiết lập linh hoạt hơn. Để biết thêm thông tin see the documentation.

Dựa trên thực tế là bạn muốn sử dụng thuộc tính TestFixtureSetUp có thể bạn sẽ cần móc BeforeFeature đó sẽ được gọi là một lần trước mỗi đối tượng, vì vậy bạn cần phải viết:

[Binding] 
public class UsersCRUDSteps 
{ 
    [BeforeFeature] 
    public static void TestInitialize() 
    {    
     ObjectFactory.Initialize(x => 
     { 
      x.For<IDateTimeService>().Use<DateTimeService>(); 
     }); 

     throw new Exception("BBB"); 
    } 

    //... 
} 

Lưu ý rằng [BeforeFeature] thuộc tính cần một phương pháp static. Bạn cũng nên lưu ý rằng nếu bạn đang sử dụng tích hợp VS, có một loại mục dự án được gọi là SpecFlow Hooks (event bindings) tạo ra một lớp ràng buộc với một số móc được xác định trước để giúp bạn bắt đầu.

+1

Cảm ơn bạn, nó hoạt động. Tôi chỉ cần thay đổi chức năng của mình thành tĩnh – muek

Các vấn đề liên quan