実際にコードを書いた後にテストを書くのはあまり良くありません。私はユニットテストの初心者であり、単体テストは多くの利点をもたらすかもしれないと感じるので、可能な限りカバーする考えに執着しました。例えば単体テストでカバーしなければならないコード内の場所を見つける方法
、我々はこのコードを持ってみましょう:
public class ProjectsPresenter : IProjectsViewObserver
{
private readonly IProjectsView _view;
private readonly IProjectsRepository _repository;
public ProjectsPresenter(IProjectsRepository repository, IProjectsView view)
{
_view = view;
_repository = repository;
Start();
}
public void Start()
{
_view.projects = _repository.FetchAll();
_view.AttachPresenter(this);
}
}
だから、あなたが一般的にテストし、私は上記のコードのその部分に書く必要があります私に答えることができる上記のコードでお探しですか?
コンストラクタの書き込みテストをロールオーバーして、リポジトリのFetchAllが呼び出され、ビューサイトのAttachPresenterが呼び出されていることを確認しています。
POSTのEDITここ
私の見解・インターフェースである:ここで
public interface IProjectsView
{
List<Project> projects { set; }
Project project { set; }
void AttachPresenter(IProjectsViewObserver projectsPresenter);
}
が表示されます。
public partial class ProjectsForm : DockContent, IProjectsView
{
private IProjectsViewObserver _presenter;
public ProjectsForm()
{
InitializeComponent();
}
public Project project
{
set
{
listBoxProjects.SelectedItem = value;
}
}
public List<Project> projects
{
set
{
listBoxProjects.Items.Clear();
if ((value != null) && (value.Count() > 0))
listBoxProjects.Items.AddRange(value.ToArray());
}
}
public void AttachPresenter(IProjectsViewObserver projectsPresenter)
{
if (projectsPresenter == null)
throw new ArgumentNullException("projectsPresenter");
_presenter = projectsPresenter;
}
private void listBoxProjects_SelectedValueChanged(object sender, EventArgs e)
{
if (_presenter != null)
_presenter.SelectedProjectChanged((Project)listBoxProjects.SelectedItem);
}
}
POST EDIT#2
これはリポジトリとの対話をテストする方法です。すべてが大丈夫ですか?
[Test]
public void ProjectsPresenter_RegularProjectsProcessing_ViewProjectsAreSetCorrectly()
{
// Arrange
MockRepository mocks = new MockRepository();
var view = mocks.StrictMock<IProjectsView>();
var repository = mocks.StrictMock<IProjectsRepository>();
List<Project> projList = new List<Project> {
new Project { ID = 1, Name = "test1", CreateTimestamp = DateTime.Now },
new Project { ID = 2, Name = "test2", CreateTimestamp = DateTime.Now }
};
Expect.Call(repository.FetchAll()).Return(projList);
Expect.Call(view.projects = projList);
Expect.Call(delegate { view.AttachPresenter(null); }).IgnoreArguments();
mocks.ReplayAll();
// Act
ProjectsPresenter presenter = new ProjectsPresenter(repository, view);
// Assert
mocks.VerifyAll();
}
鼻緒模型の例は無関係なようです...別の質問に値するかもしれません。とにかく、あなたはおそらくrhino mocksのAAA構文を見たいでしょう。 http://stackoverflow.com/questions/2124175/rhino-mocks-aaa-quick-start –