【发布时间】:2018-07-02 17:49:00
【问题描述】:
我想测试应用层的类,但不确定哪个更好。我的领域模型类是任务,例如
class Task {
private Clock clock;
public Guid Id {get; private set;}
public string Name {get; set;}
public DateTime StartedDate {get; private set;}
public Task(Guid id, string name, Clock pClock) {
Id = id;
Name = name;
clock = pClock;
StartedDate = clock.Now();
}
}
interface Clock
{
DateTime Now {get;}
}
所以我想测试 WorkManagementService 类的 CreateTask 方法。我不明白我应该测试什么。假设,我写测试
TestCreateTaskShouldReturnTaskIdWasCreated()
{
Guid taskId = Guid.Empty;
TaskRepository repository = Substitute.For<TaskRepository>();
repsitory.Add(Arg.Do<Task>(taskArgument => taskId = taskArgument.Id));
var service = new WorkManagementService(repository);
var createdTaskId = service.CreateTask("task name");
Assert.AreNotEqual(Guid.Empty, createdTaskId);
Assert.AreEqual(taskId, createdTaskId);
}
所以,我不确定这是否是一种好习惯。 CreateTask 方法使用 Task 构造函数来创建 Task 和 Clock 接口的一些实现,因此 WorkManagementService 类依赖于它们。是好方法吗?
如果这令人困惑,我很抱歉。
更新 我在想 CreateTask 方法的第一个实现可能如下。
class WorkManegementService
{
private TaskRepository taskRepository;
public WorkManegementService(TaskRepository pTaskRepository)
{
taskRepository = pTaskRepository;
}
Guid CreateTask(string name)
{
var taskId = Guid.NewGuid();
var task = new Task(taskId, name, new SystemClock());
try
{
taskRepository.Save(task);
return taskId;
}
catch (...)
{
// some handling
}
}
}
在进一步的实施过程中,我将添加任务所有者或类似的东西。
【问题讨论】:
-
请显示
CreateTask方法和它所在的类。从你的问题中不清楚这个方法与你的测试有多大的关系。 -
@NightOwl888,我已经更新了问题。
-
您的测试使用
Create方法,而不是CreateTask方法。如果这不是错字,请同时发布Create方法。 -
@NightOwl888,这是我的错误,对不起。它使用
CreateTask方法。
标签: .net unit-testing tdd domain-driven-design nsubstitute