Back to all reviewers

Write robust assertions

vercel/next.js
Based on 5 comments
TypeScript

When writing tests, ensure assertions can handle non-deterministic content while providing clear failure context: use targeted assertions for non-deterministic content, use specialized tools like cheerio for DOM testing, and include contextual information in diagnostic tests.

Testing TypeScript

Reviewer Prompt

When writing tests, ensure assertions can handle non-deterministic content while providing clear failure context:

  1. For non-deterministic content (like absolute paths in error outputs):
    • Use targeted assertions (toContain(), toInclude()) instead of full snapshots
    • Add explanatory comments about why standard approaches aren’t being used
    // GOOD
    // rspack returns error content that contains absolute paths which are non deterministic
    await session.assertHasRedbox();
    expect(redboxContent).toContain("Module not found: Can't resolve 'dns'");
    expect(redboxLabel).toContain('Build Error');
       
    // AVOID
    await expect(browser).toDisplayRedbox(`
      "error": {
        "message": "[absolute path that will change]",
      }
    `);
    
  2. For DOM testing:
    • Use specialized tools like cheerio instead of string manipulation
    • Add identifiers to tested elements to make assertions more reliable
    // GOOD
    const $ = await next.render$('/');
    expect($('#server-value').text()).toBe('Server value: foobar');
       
    // AVOID
    const html = (await res.text()).replaceAll(/<!-- -->/g, '');
    expect(html).toContain('Server value: foobar');
    
  3. For diagnostic tests:
    • Include contextual information (e.g., filenames) in assertions
    • Use declarative assertion patterns over iterative approaches
    // GOOD
    expect(diagnosedFiles).toEqual({
      'page.tsx': { code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT, /*...*/ },
      'layout.tsx': { code: NEXT_TS_ERRORS.INVALID_METADATA_EXPORT, /*...*/ }
    });
       
    // AVOID
    for (const tsFile of tsFiles) {
      const diagnostics = languageService.getSemanticDiagnostics(tsFile);
      expect(diagnostics.length).toBe(1);
      // No context about which file failed if assertion fails
    }
    
5
Comments Analyzed
TypeScript
Primary Language
Testing
Category

Source Discussions