如何断言MustHaveHappend(Collection.That.Contains(object))假装很简单

时间:2017-12-17 22:15:49

标签: c# unit-testing tdd repository-pattern fakeiteasy

我在Arrange

中有如下的课程资料库
A.CallTo(
            () => _courseClientStatusRepository.GetTnCoursesForClientStatus()).Returns(new List<CourseClientStatusCreationDto>
                {
                    new CourseClientStatusCreationDto { CourseTnId = Enums.CourseLevel.Beginner  },
                    new CourseClientStatusCreationDto { CourseTnId = Enums.CourseLevel.Intermediate, },
                    new CourseClientStatusCreationDto { CourseTnId = Enums.CourseLevel.Advanced,  }
                }
            );

在法案中,我有一个调用

的方法
void CreateClientCourseStatus(List<CourseClientStatusDto> courseClientStatusDto);

ICourseClientStatusRepository

的方法

在Assert中,我有以下内容。第一个断言通过,第二个和第三个断言失败。

A.CallTo(
            () => _courseClientStatusRepository.CreateClientCourseStatus(A<List<CourseClientStatusDto>>.Ignored))
            .MustHaveHappened();

        A.CallTo(
            () => _courseClientStatusRepository.CreateClientCourseStatus(A<List<CourseClientStatusDto>>.That.Contains(A<CourseClientStatusDto>.Ignored)))
            .MustHaveHappened();


        A.CallTo(
            () => _courseClientStatusRepository.CreateClientCourseStatus(A<List<CourseClientStatusDto>>.That.Contains(A<CourseClientStatusDto>.That.Matches(
                x => x.CourseTnId == Enums.CourseLevel.Beginner               
                ))))
                .MustHaveHappened();

我至少期望第二个断言传递它期望一个类型为CourseClientStatusDto的对象的实例,其中其特定值并不重要,因此我使用.Ignored属性。

如果一个集合包含一个特定的对象(使用假的那么简单.mustHaveHappened()方法),是否有一些我做错的断言?

1 个答案:

答案 0 :(得分:1)

@Ntu,我可以问你使用的是什么版本的FakeItEasy吗?

A<T>.Ignored属性仅在呼叫配置或验证期间用作参数说明符时适用;它无法在其他地方使用,例如在Contains方法中。从FakeItEasy 4.1.1开始,你应该得到一个明确的错误来表明这一点。例如,使用FakeItEasy 4.3.0,当我运行测试的近似值时,我会看到这一点:

Test 'FakeItEasyQuestions2015.Ntu.NestedConstraint' failed: System.InvalidOperationException : An argument constraint, such as That, Ignored, or _, cannot be nested in an argument.

我们经常更新软件包,因此升级错误修复和改进总是一个好主意。

您可以使用以下内容替换最后两张支票:

 A.CallTo(() => _courseClientStatusRepository.CreateClientCourseStatus(A<List<CourseClientStatusDto>>.That.Not.IsEmpty()))
    .MustHaveHappened();

A.CallTo(() => _courseClientStatusRepository.CreateClientCourseStatus(
A<List<CourseClientStatusDto>>.That.Matches(l => l.Exists(i => i.CourseTnId == Enums.CourseLevel.Beginner))))
    .MustHaveHappened();

在我发表评论时,我无法提醒您注意,在您的编配中,A.CallTo的返回值未被使用,因此您不会指定任何实际值行为(除非你为了简洁而把它留下来......)。考虑将FakeItEasy.Analyzer.CSharp添加到您的项目中;它会警告你这些问题!