Question

I have a simple "Get" method. Ex:

public class Foo : IFoo
{
    public Dictionary<string,string> GetSomething(string xyz)
    {
        var result = new Dictionary<string,string>
        ... Go to DB and return some key value pairs
        return result;
    }
}

I wrote a simple test that execute and passes successfully but I'm not getting code coverage on the method.

[TestMethod()]
    public void GetSomething()
    {
        var target = new StubIFoo();

        var expected = new Dictionary<string, string> 
        {
            {"blahKey","blahValue"}
        };

        var results = target.GetSomethingString = s =>
        {
            var result = new Dictionary<string, string> {{"a", "b"}};
            return result;
        };

        var actual = results("a");

        CollectionAssert.AreEqual(expected,actual);
    }

I also tried to target the class itself, which provides the coverage but doesn't return any results (ex: "var target = new StubFoo();")

Again, it successfully executes and passes but I'm not getting any coverage. Any pointers would be appreciated. Thanks.

Was it helpful?

Solution 2

In your test you are not calling the method GetSomething, but instead are setting a value to the property GetSomethingString.

// Here is the problem. This:
var results = target.GetSomethingString = s =>
{
    var result = new Dictionary<string, string> {{"a", "b"}};
    return result;
};
// Is equal to this:
var lambda = s =>
{
    var result = new Dictionary<string, string> {{"a", "b"}};
    return result;
};
var results2 = target.GetSomethingString = lambda;

OTHER TIPS

Foo.GetSomething() has 0 code coverage, because you never call it in your test. Instead, you call StubIFoo.GetSomething().

Change var target = new StubIFoo(); into var target = new Foo();, remove the code initializing StubIFoo and you will get some coverage.

Stubs are there to prevent you from using (and testing) the real class. But you must not use a stub of the class you are testing !

Here is general idea what you should do

public class Foo : IFoo
{
    IDbAccess db;

    // Pass the interface, do pass parameters to create it inside constructor
    public Foo(IDbAccess db)
    {
        this.db = db; 
    }

    public Dictionary<string,string> GetSomething(string xyz)
    {
        var result = new Dictionary<string,string>

        // ... Go to DB and return some key value pairs
        result.Add(db.MethodWhatever(xyz));

        return result;
    }
}

[TestMethod()]
public void GetSomething()
{
    var dbMock = new DatabaseMock(); // This implements IDbAccess
    var target = new Foo(dbMock);

    var expected = new Dictionary<string, string> 
    {
        {"blahKey","blahValue"}
    };

    // get something
    var results = target.GetSomething("xyzstring");

    // verify results
    var actual = results.whatever;

    CollectionAssert.AreEqual(expected,actual);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top