0

我有以下使用 Moq 的单元测试,它们编译并给我正确的结果,但是我不相信我已经正确地实现了它们,或者如果我有,那么我误解了 Moq 在这种情况下正在做什么。

这是我的单元测试:

TaskInstance taskInstance_1 = new TaskInstance() { Id = 1, Task = task_1 };
IEnumerable<TaskInstance> _domainTaskInstances = new List<TaskInstance>() 
    { taskInstance_1 };

[TestMethod()]
public void TaskService_CheckForTaskUsage_Success()
{
    _taskInstanceRepository.Setup(x => x.Get(It.IsAny<Expression<Func<
        TaskInstance, bool>>>(), null, "")).Returns(_domainTaskInstances);

    int taskId = 1;
    bool expected = true;
    bool actual;
    actual = GetTarget().CheckForTaskUsage(taskId);
    Assert.AreEqual(expected, actual);
}

[TestMethod()]
public void TaskService_CheckForTaskUsage_Failure()
{
    _taskInstanceRepository.Setup(x => x.Get(It.IsAny<Expression<Func<
        TaskInstance, bool>>>(), null, "")).Returns(new List<TaskInstance>()
        .AsEnumerable());

    int taskId = 2;
    bool expected = false;
    bool actual;
    actual = GetTarget().CheckForTaskUsage(taskId);
    Assert.AreEqual(expected, actual);
}

我正在检查的方法是这样的:

public bool CheckForTaskUsage(int taskId)
{
    return _taskInstanceRepository.Get(x => x.Task.Id == taskId).Any();
}

我嘲笑的方法是这样的:

IEnumerable<T> Get(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, 
    IOrderedQueryable<T>> orderBy = null, string includeProperties = "");

GetTarget()方法创建了该CheckForTaskUsage()方法所在的类的一个实例_taskInstanceRepository并被设置。

我的困惑归结为存储库.Returns()中方法的模拟部分。Get()我不确定按照我所做的设置返回值是否正确,因为从我的角度来看,它似乎不会真正执行Get()传递给它的方法和表达式。但是,这可能是正确的,因为我没有尝试执行该Get()方法,只为其返回一些值,但如果是这种情况,我为什么要关心发送给它的可能参数?

谢谢

4

1 回答 1

2

从我的角度来看,它似乎不会真正执行 Get() 方法和传递给它的表达式。

没错——它实际上不会从数据库中获取数据。单元测试应该测试逻辑而不是数据库连接。

我为什么要关心发送到其中的可能参数?

例如,您可以测试某些参数是否引发异常或返回 null。例如,-1 可能会引发异常。在这种情况下,您需要对此进行测试。

Assert.IsTrue还要注意其他可能更合适的Assert 选项,例如。

于 2013-09-27T12:46:39.713 回答