1

我正在使用 DotCover 检查单元测试覆盖率。在我从 SearchResult 中的活动目录返回结果的方法之一中,我模拟了该类,但 DotCover 显示 0%

public virtual T SearchOneRecord(ISearchConfigurator configurator)
    {
        var record = (T)Activator.CreateInstance(typeof(T));
        var searchResult = configurator.DirectorySearcher.FindOne();
        if (searchResult != null)
        {
            AssignActiveDirectoryValue(searchResult, record);
        }

        return record;
    }

[Test]
    public void SearchOneRecord()
    {
        //Arrange
        var configuratorMock = MockRepository.GenerateMock<ISearchConfigurator>();
        var searchMock = MockRepository.GenerateStub<Searcher<NativeDs>>();
        searchMock.Replay();

        var nativeDs = new NativeDs() { PasswordAge = 100 };
        searchMock.Expect(x => x.SearchOneRecord(configuratorMock)).Return(nativeDs);

        //Act
        var record = searchMock.SearchOneRecord(configuratorMock);

        //Assert
        Assert.AreEqual(nativeDs.PasswordAge, record.PasswordAge);
    }

测试通过了,但由于我是 RhinoMock 的新手(一般是在模拟),所以可能存在问题。

任何的想法?

4

1 回答 1

1

如果我错了,请纠正我,但你在这里所做的是定义模拟,然后测试这个模拟是否正常工作?我不认为这是你想要达到的目标。当然它会导致测试通过 - 模拟工作正常,但它根本没有测试你的应用程序代码 - 因此覆盖率为 0%。

您想要做的可能是模拟ISearchConfigurator实例,然后将该模拟作为参数传递给方法。

[Test]
public void SearchOneRecord()
{
    //Arrange
    var configuratorMock = MockRepository.GenerateMock<ISearchConfigurator>();
    var directorySearcherMock = MockRepository.GenerateMock<IDirectorySearcher>(); // please note I don't know exact type, so you need to ammend it
    var returnValue = ... // initialize with types you expect DirectorySearcher to return
    var searcher = new Searcher(); // initialize class you actually want to test
    configurationMock.Replay();

    configurationMock.Expect(x => x.DirectorySearcher).Return(directorySearcherMock);
    directorySearcher.Expect(x => x.FindOne()).Return(returnValue);
    searchMock.Expect(x => x.SearchOneRecord(configuratorMock)).Return(nativeDs);

    //Act
    var record = searcher.SearchOneRecord(configuratorMock);

    //Assert
    Assert.AreEqual(nativeDs.PasswordAge, record.PasswordAge);
}

请注意,我目前无法测试此代码,但它应该为您提供一些关于它应该如何完成的指导。

于 2013-04-15T11:11:30.557 回答