angularjs - 我应该在 AngularJS 中测试什么?

标签 angularjs unit-testing testing karma-runner

<分区>

如今,特别是在 angularjs 测试领域,有很多针对不同类型测试的指南,例如单元测试、中途测试和 E2E 测试,您可以在其中学习如何对 Controller 、工厂进行这些不同的测试等

主题是,什么应该是可测试的?我可以测试我的模块应用程序是否具有 Controller 、指令、成功登录、检查对后端的调用等。但是我应该测试什么?,因为你可以测试所有的东西,这可能不是进行“简单测试”的好习惯。

有人可以给我任何建议吗?谢谢。

最佳答案

要获得一般答案,您可以查看此 question .

假设您的 Angular 单元测试是用 Jasmine 或类似的东西编写的,请注意 Jasmine 面向“行为驱动开发”。

来自 this presentation : “行为驱动开发是通过从利益相关者的 Angular 描述其行为来实现应用程序”

Bob Martin 的 Clean Code 是另一个很好的来源,但更严格(面向 TDD 或测试驱动开发)。我最大的测试收获:

  • 让测试成为您的文档
  • 您的测试使您可以自由重构
  • 在靠近用户或消费者的地方进行测试,并在需要时深入研究

也就是说,

  • 注释可能会过时,但单元测试必须响应更改才能通过。如果您按照 BDD 建议针对特定用户场景进行写作,这一点尤其重要。
  • 如果您将测试视为需求的总结,那么每当您为新功能更改代码并运行测试套件时,您都会立即知道您的代码是否仍然满足需求。
  • 私有(private)辅助方法、返回类型和数据结构可能会经常更改。用户或消费者不关心这些,只关心对于一组给定的输入,他们会得到一定的效果或返回。

例子:

作为一个粗略的例子,假设您需要一个应用程序来轮询给定城市的天气预报数据。您的用户或客户代码的要求可以表述为“给定一组天气数据,当我输入城市名称时,我应该获得 5 天的预报数据”。然后您可能会进行如下测试:

  describe('Given a set of weather data'....
      ...
      describe('when I enter Los Angeles', function() {
          it('should return 5 days of forecast data for Los Angeles', 
          mocks.inject(function(weatherService) {
          var result = weatherService.getForecast('Los Angeles');
            expect(result.DayToForecast.lenth).toEqual(5);
          }));
      });
      ...

然后假设您有另一个要求天气数据说明湿度,例如“给定一组天气数据,当我输入城市名称和日期时我应该得到湿度数据”

      ...
      describe('When I enter Los Angeles and Monday', function() {
          it('should return humidity data for Los Angeles on Monday', 
          mocks.inject(function(weatherService) {
          var result = weatherService.getForecast('Los Angeles');
            expect(result.DayToForecast['Monday'].humidity).not.toBe(null);
          }));
      });
      ...

这里我们并不关心结果的结构,只关心它以某种方式给出了星期一的湿度概念。我们也不真正关心 weatherService 的内部(例如,如果它从数据库、静态文件或其他 Web 服务获取数据)。你可能有这样的东西,但仍然表达了需求:

      ...
      describe('when I enter Los Angeles and Monday', function() {
          it('should return humidity data for Los Angeles on Monday', 
          mocks.inject(function(weatherService) {
          var result = weatherService.getForecast('Los Angeles','Monday');
            expect(result.humidity).not.toBe(null);
          }));
      });
      ...

这里很酷的一点是,您可以“一厢情愿地编写代码”——您可以创建接近用户和用例的函数签名,然后填写它们,只获得您需要的东西。现在,如果您的第一个要求更改为“给定一组天气数据,当我输入一个城市名称时,我应该获得 4 天的预报数据”,您必须更改测试而不是搜索评论,您只需要更改与该需求更改相关的代码。

您的某些行为可能不会被您的用户明确说明。例如,对于上面的示例,最终用户比 Web 服务消费者客户端更不可能说:“给定一组天气数据,当我输入城市名称和虚构的一天时,我应该得到一个异常(exception)"你必须自己收集那个和测试用例:

      ...
      describe('when I enter Los Angeles and EigthDay', function() {
          it('should throw an exception', 
          mocks.inject(function(weatherService) {
          var weatherServiceCall = function(){
                weatherService.getForecast('Los Angeles','EighthDay');
              };
              expect(weatherServiceCall).toThrow();
          }));
      });
      ...

关于angularjs - 我应该在 AngularJS 中测试什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21934698/

相关文章:

java - 谷歌指南 : Mock a @provides method consists of set of object

javascript - 柏树调用 ('removeAttr' , 'target' ) 不工作

testing - Google reCAPTCHA V2 - 触发更难的测试版本?

html - 如何使用 angularJS 显示模态弹出窗口?

angularjs - Angular,如何有条件地设置必填字段的样式?

angularjs - 使用 $timeout 时的 Promise 链接

performance - 如何对不同编程语言编写的库进行性能测试?

css - 使用 angularjs 动态样式化伪元素

java - Mockito - @Spy vs @Mock

python - 艰难地学习 Python,Ex 49 : Comparing objects using assert_equal