我正在尝试使用一些虚拟数据建立一种单元测试服务层(&存储库)的方法。我以前在使用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);
}
答案 0 :(得分:0)
在测试中调用phraseRepository.Object.GetPhrase("H300")
将始终返回null
,除非您将其设置为返回不同的内容。
我认为您错误地认为此次GetPhrase
来电会像具体的GetMany
一样调用PhraseRepository
,但您需要记住它只是界面IPhraseRepository
的模拟。模拟对象上的方法将始终返回返回类型的默认值(在本例中为string
),除非您使用Setup
来更改该方法的行为。