Skip to content

[BUG] ExcludeFromCodeCoverage does code exclude method in a partial class that contains a linq expression #1548

Closed
@bdurrani

Description

@bdurrani

Describe the bug
Please share a clear and concise description of the problem.

To Reproduce
I have the following class under Test

public partial class StuffMcStuffy
{
    private readonly ILogger<StuffMcStuffy> _logger;

    public StuffMcStuffy(ILogger<StuffMcStuffy> logger)
    {
        _logger = logger;
    }

    [LoggerMessage(
        EventId = 0,
        Level = LogLevel.Information,
        EventName = "testname",
        Message = "tes:extraction {JobId} {ExtractionStatus} {ExtractionError}")]
    private partial void RecordExtractionEvent(Guid jobId, string extractionStatus, string extractionError);

    [ExcludeFromCodeCoverage]
    public void DoThis()
    {
        Console.Write("do this");
    }

    public void DoThat()
    {
        Console.Write("do that");
    }

    public void BlahThis()
    {
        var thislist = new List<KeyValuePair<string, object>>();
        thislist.Add(new KeyValuePair<string, object>("hey", "ho"));
        thislist.Add(new KeyValuePair<string, object>("hey1", "ho1"));
        var blah = CreateLoggerDictionary(thislist);
        blah.ToString();
    }

    [ExcludeFromCodeCoverage]
    private static Dictionary<string, string> CreateLoggerDictionary(List<KeyValuePair<string, object>> attributes)
    {
        return attributes.ToDictionary(item => item.Key,
            item => item.Value.ToString() ?? string.Empty);
    }
}

I used the following script to run the unit tests and generate the coverage reports

#!/usr/bin/env bash

set -euo pipefail

find . -type d -name TestResults -exec rm -rf {} +
rm -rf ./codeCoverageReport

PROJECTS="$(find . -type d -name "TestProject1")"
readonly PROJECTS

for project in ${PROJECTS}; do
  dotnet test -c Release "$@" "${project}" --collect:"XPlat Code Coverage" --logger "console;verbosity=normal" --logger trx
done

dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
REPORT_TYPE=Html
COMMAND=open
FILENAME=index.html
TARGETDIRECTORY="$(ls -d "${dir}"/.)/codeCoverageReport"
REPORTS="$(find "${dir}/.." -type f -name "coverage.cobertura.xml" | tr "\n" ";")"

dotnet ~/.nuget/packages/reportgenerator/*/tools/*/ReportGenerator.dll \
  -reports:"${REPORTS}" \
  -targetdir:"${TARGETDIRECTORY}" \
  -reporttypes:"${REPORT_TYPE}" && \
  "${COMMAND}" "${TARGETDIRECTORY}/${FILENAME}"

Expected behavior

The method CreateLoggerDictionary() should be excluded from test coverage

Actual behavior

The method is not excluded from coverage

image

** Workaround **

Rewrite the code using foreach()

  private static Dictionary<string, string> CreateLoggerDictionary(List<KeyValuePair<string, object>> attributes)
    {
        Dictionary<string, string> dictionary = new Dictionary<string, string>();
        foreach (var attribute in attributes)
        {
            dictionary.Add(attribute.Key, attribute.Value.ToString() ?? string.Empty);
        }
        return dictionary;
    }
image

Configuration (please complete the following information):
Please provide more information on your .NET configuration:
* Which coverlet package and version was used? v 6.0
* Which version of .NET is the code running on? .NET 6
* What OS and version, and what distro if applicable? Mac OS
* What is the architecture (x64, x86, ARM, ARM64)? ARM64
* Do you know whether it is specific to that configuration? No

Additional context
I've attached the project here
Coverlet-Test.zip

❗ Please also read Known Issues

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingwith reproIssue with repro

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions