gpt4 book ai didi

c# - 如何在代码中找到单元测试必须覆盖的地方

转载 作者:行者123 更新时间:2023-11-30 17:12:46 25 4
gpt4 key购买 nike

我知道在实际编写代码后编写测试不太好。我是单元测试的新手,觉得单元测试可以带来很多好处,所以我痴迷于尽可能多地覆盖的想法。

例如,让我们有这样的代码:

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 并调用了 View 站点上的 AttachPresenter。


后期编辑

这是我的 View 界面:

public interface IProjectsView
{
List<Project> projects { set; }
Project project { set; }

void AttachPresenter(IProjectsViewObserver projectsPresenter);
}

这是一个 View :

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);
}
}

发布编辑#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();
}

最佳答案

I know it's not so good to write tests after you actually wrote code

总比不写测试要好。

您的方法适用于两个外部组件,并且应该验证该交互(除了提到的参数验证之外)。检查 FetchAll 是否被调用没有给你任何值(value)(或者检查它返回东西 - 这属于 ProjectsRepository 测试自己) - 您要检查 View 的项目是否已设置(这将间接检查是否调用了 FetchAll)。您需要的测试是:

  • 验证 View 项目是否设置为预期值
  • 验证演示者已连接
  • 验证输入参数

编辑:您将如何测试第一个案例的示例(项目已设置)

// "RegularProcessing" in test name feels a bit forced;
// in such cases, you can simply skip 'conditions' part of test name
public void ProjectsPresenter_SetsViewProjectsCorrectly()
{
var view = MockRepository.GenerateMock<IProjectView>();
var repository = MockRepository.GenerateMock<IProjectsRepository>();
// Don't even need content;
// reference comparison will be enough
List<Project> projects = new List<Project>();
// We use repository in stub mode;
// it will simply provide data and that's all
repository.Stub(r => r.FetchAll()).Return(projects);
view.Expect(v => v.projects = projects);

ProjectsPresenter presenter = new ProjectsPresenter(repository, view);

view.VerifyAllExpecations();
}

在第二种情况下,您将期望其 AttachPresenter 被有效对象调用:

public void ProjectsPresenter_AttachesPresenterToView()
{
// Arrange
var view = MockRepository.GenerateMock<IProjectView>();
view.Expect(v => v.AttachPresenter(Arg<IProjectsViewObserver>.Is.Anything));
var repository = MockRepository.GenerateMock<IProjectsRepository>();

// Act
var presenter = new ProjectsPresenter(repository, view);

// Assert
view.VerifyAllExpectations();
}

关于c# - 如何在代码中找到单元测试必须覆盖的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10394199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com