我第一次嘗試SpecFlow,我想知道我是否可能推翻了整個概念或者更糟糕,完全濫用了它的預期目的?使用SpecFlow進行項目體系結構(MVP-VM)
我想爲我的WinForms項目採用MVP-VM體系結構設計模式,並列出了將按照相同模式定義未來項目的樣板故事。
歡迎任何建議,謝謝!
Feature: DesignPattern
In order to encourage pluggability and loose coupling
As a software developer who has to comply with company GUI standards
I want to make sure the MVP-VM design pattern is enforced
@mytag
Scenario: MainPresenter loosely couples with IMainView and IModelContainer implementations
Given a stub of the IMainView interface
And a stub of the IModelContainer interface
When I create a new MainPresenter with the IMainView and IModelContainer stubs as arguments
Then the MainPresenter should have the IMainView and IModelContainer stubs as properties
Scenario: MainPresenter tightly couples with MainViewModel
Given a stub of the IMainView interface
And a stub of the IModelContainer interface
When I create a new MainPresenter with the IMainView and IModelContainer stubs as arguments
Then the MainPresenter should have a collection of MainViewModels as a property
Scenario: IModelContainer contains all required model interfaces
Given a stub of the IModelContainer interface
Then the IModelContainer stub should have an IContractsModel property
Scenario: IMainView extends the company BaseView GUI standard
Given a stub of the IMainView interface
Then the IMainView stub should extend the IBaseView interface
Scenario: IMainView exposes a datasource binding method that accepts a collection of MainViewModels as argument
Given a stub of the IMainView interface
And a collection of MainViewModels
Then the IMainView stub should have a BindViewModelsList method that accepts the collection of MainViewModels
Scenario: MainViewModel takes a ContractDataEntity and stores it as a property
Given a ContractDataEntity
When I create a new MainViewModel with the ContractDataEntity as argument
Then the MainViewModel should have the ContractDataEntity as a property
Scenario: MainViewModel presents the required attributes of its associated DataEntity
Given a ContractDataEntity
When I create a new MainViewModel with the ContractDataEntity as argument
Then the MainViewModel should have the ContractDataEntity ContractNumber as a property
And the MainViewModel should have the ContractDataEntity CustomerCode as a property
Scenario: MainViewModel has a factory method that translates a collection of DataEntities into MainViewModels
Given a collection of ContractDataEntities
When I call the MainViewModel TranslateDataEntityList factory method
Then it should return a collection on MainViewModels
我會再生成類,屬性和方法存根從SpecFlow方法:
using Rhino.Mocks;
using Should.Fluent;
using TechTalk.SpecFlow;
namespace CONTR001.Test
{
[Binding]
public class DesignPatternSteps
{
[Given(@"a stub of the IMainView interface")]
public void GivenAStubOfTheIMainViewInterface()
{
IMainView view = MockRepository.GenerateStub<IMainView>();
ScenarioContext.Current.Set(view);
}
[Given(@"a stub of the IModelContainer interface")]
public void GivenAStubOfTheIModelContainerInterface()
{
IModelContainer model = MockRepository.GenerateStub<IModelContainer>();
ScenarioContext.Current.Set(model);
}
...
[When(@"I create a new MainPresenter with the IMainView and IModelContainer stubs as arguments")]
public void WhenICreateANewMainPresenterWithTheIMainViewAndIModelContainerStubsAsArguments()
{
var view = ScenarioContext.Current.Get<IMainView>();
var model = ScenarioContext.Current.Get<IModelContainer>();
var presenter = new MainPresenter(view, model);
ScenarioContext.Current.Set(presenter);
}
...
[Then(@"the MainPresenter should have the IMainView and IModelContainer stubs as properties")]
public void ThenTheMainPresenterShouldHaveTheIMainViewAndIModelContainerStubsAsProperties()
{
var presenter = ScenarioContext.Current.Get<MainPresenter>();
presenter.View.Should().Equal(ScenarioContext.Current.Get<IMainView>());
presenter.Model.Should().Equal(ScenarioContext.Current.Get<IModelContainer>());
}
...
[Then(@"the IMainView stub should extend the IBaseView interface")]
public void ThenTheIMainViewStubShouldExtendTheIBaseViewInterface()
{
var view = ScenarioContext.Current.Get<IMainView>();
view.Should().Be.AssignableFrom<IBaseView>();
}
}
}
謝謝你,AlSki。你的話是令人鼓舞的,我會堅持下去。我會問你同樣的問題,我做湯姆;是否有更好的爲WinForms定製的工具可以執行我在文章中強調過的相同的域問題? – Heliac 2013-03-05 08:09:57
湯姆,我一定錯過了你正在使用WinForms :-)你的代碼實際上更多的是關於MVC模式和問題分離而不是UI技術。我打算建議看一下CAB,但是在我的搜索鏈接中,我發現這個http://stackoverflow.com/questions/654722/implementing-mvc-with-windows-forms,它看起來像覆蓋了更多深度比我要適應在這裏。 :-) – AlSki 2013-03-05 12:04:41