【发布时间】:2010-12-09 13:31:56
【问题描述】:
我正在使用 .NET 4、NUnit 和 Rhino 模拟。我想对我的新闻存储库进行单元测试,但我不确定如何去做。我的新闻存储库是我最终用来与数据库通信的东西。我想用它来测试虚假/虚拟数据。不知道有没有可能??这是我目前拥有的:
public interface INewsRepository
{
IEnumerable<News> FindAll();
}
public class NewsRepository : INewsRepository
{
private readonly INewsRepository newsRepository;
public NewsRepository(INewsRepository newsRepository)
{
this.newsRepository = newsRepository;
}
public IEnumerable<News> FindAll()
{
return null;
}
}
我的单元测试如下所示:
public class NewsRepositoryTest
{
private INewsRepository newsRepository;
[SetUp]
public void Init()
{
newsRepository = MockRepository.GenerateMock<NewsRepository>();
}
[Test]
public void FindAll_should_return_correct_news()
{
// Arrange
List<News> newsList = new List<News>();
newsList.Add(new News { Id = 1, Title = "Test Title 1" });
newsList.Add(new News { Id = 2, Title = "Test Title 2" });
newsRepository.Stub(r => r.FindAll()).Return(newsList);
// Act
var actual = newsRepository.FindAll();
// Assert
Assert.AreEqual(2, actual.Count());
}
}
在上面的代码中,我不确定我需要模拟什么。上面的代码编译但在 NUnit GUI 中关于构造函数值失败。我只能假设它与我需要提供给 NewsRepository 的 INewsRepository 参数有关。我不知道如何在测试中做到这一点。有人可以纠正我的单元测试,以便它通过 NUnit GUI 吗?有人可以就我是否正确实施我的存储库提供一些反馈吗?
作为嘲笑的新手,我有什么需要验证的吗?我什么时候需要验证?它的目的是什么?我一直在研究几个源代码项目,有些使用验证,有些不使用。
如果上述测试通过,这对作为开发人员的我来说意味着什么?其他开发人员必须对我的存储库做什么才能使其在 NUnit GUI 中失败?
抱歉所有问题,但它们是新手问题:)
希望有人能帮帮我。
【问题讨论】:
-
我看对了吗? NewsRepository 本身也有同样的东西?
-
看起来您的测试正在测试 Rhino Mocks。也就是说,您设置了一个模拟对象并断言它返回您告诉它在测试中返回的内容。根据您的描述,我认为您将拥有一个与数据库交互的数据层,这就是您将模拟来测试您的业务逻辑。
-
你有 NewsRepository 实现了 INewsRepository,但作为构造函数也得到了另一个 INewsRepository。当然,如果它是 INewsRepository 的唯一实现,则永远无法实例化它。
-
我有一个 NewsService 将调用这个 NewsRepository 实例,我也将对其进行测试。我想一次做一件事。请记住我是新手,我更喜欢代码示例,而不是批评。
-
这不是批评,只是反馈;-)。
标签: c# .net unit-testing nunit rhino-mocks