NUnit - 模拟存储库并使用虚拟数据进行测试

时间:2014-09-19 11:31:37

标签: asp.net-mvc nunit moq

我正在尝试使用一些虚拟数据建立一种单元测试服务层(&存储库)的方法。我以前在使用Generic Repositories时已经看过这个例子,但是在使用DatabaseFactory的时候我正在努力让事情有效。

当我从repository.Object调用GetPhrase方法时,我每次都会返回null。

我正在使用NUnit和Moq。任何关于我出错的指示都会受到赞赏,或者让我知道如果我最好走另一条路 例如连接到本地数据库以进行测试(SQL CE等)

以下是代码的主要组成部分:

public class PhraseRepository : RepositoryBase<Phrase>, IPhraseRepository
{
    public PhraseRepository(IDatabaseFactory databaseFactory)
        : base(databaseFactory)
    {
    }

    public string GetPhrase(string phraseCode)
    {
        return this.GetMany(p => p.PhraseCode == phraseCode).First().Descript;
    }

}

public interface IPhraseRepository : IRepository<Phrase>
{
    string GetPhrase(string phraseCode);
}

public class CLPRiskPhraseService : ICLPRiskPhraseService
{
    private readonly IPhraseRepository phraseRepository;

    public string GetPhrase(string phraseCode)
    {
        return phraseRepository.GetPhrase(phraseCode);
    }
}


[Test]
public void GetPhrase()
{
    var phrases = new FakePhraseData().GetPhrases();
    phraseRepository.Setup(m => m.GetMany(It.IsAny<Expression<Func<Phrase, bool>>>())).Returns(phrases);

    var result = phraseRepository.Object.GetPhrase("H300");
    // Assert
    NUnit.Framework.Assert.IsNotNull(phraseRepository.Object);
    NUnit.Framework.Assert.AreEqual("Description0", result);
}

1 个答案:

答案 0 :(得分:0)

在测试中调用phraseRepository.Object.GetPhrase("H300")将始终返回null,除非您将其设置为返回不同的内容。

我认为您错误地认为此次GetPhrase来电会像具体的GetMany一样调用PhraseRepository,但您需要记住它只是界面IPhraseRepository的模拟。模拟对象上的方法将始终返回返回类型的默认值(在本例中为string),除非您使用Setup来更改该方法的行为。