1

我是 specflow 的新手,并且对如何模拟我的控制器依赖项有疑问。例如,我有一个 UserController 类,它依赖于我的 UserRepository 类,该类通过其构造函数传递给控制器​​类。所以使用 Moq 我正在做这样的事情:

var mock = new Mock<UserRepository>();
mock.Setup(m => m.ListAll()).Returns(new List<User>());
var browser = new IE(string.Format("http://localhost:4265/{0}",
username));

但是我的控制器没有使用模拟对象,我应该怎么做?

谢谢

4

2 回答 2

1

您正在混合三个(至少)测试框架,这当然很酷,但您可能应该停下来考虑一下您要测试的是什么。

Watin 非常适合测试您的 UI,因为它控制浏览器实例。我发现它擅长进行回归测试http://en.wikipedia.org/wiki/Regression_testing

Specflow 也很棒——我个人喜欢用它来缩小业务开发人员和(我们)软件开发人员之间的差距,因为我们实际上可以用我们都理解的术语定义需求(可能还有组织的其他部分)我不知道不想引发一场激烈的战争,但它可能会带来比它解决的问题更多的问题,除非你专注于它的真正价值。我们在工作中通过测试服务层(表示层中的控制器下面的一层)来使用它,我们实际上只模拟数据库、外部服务和文件系统等——这使得我们的规范流测试某种集成测试。

Moq 是一个模拟框架,当然可以在任何类型的测试中使用(就像我只是让它溜走)但这是一个非常好的单元测试工具。

所以回到你的问题。如果您想进行一次测试以找到所有错误,那么您就有麻烦了;)我知道您不希望这样做-这只是我提出的一个愚蠢的建议-但实际上,如果您只想进行集成测试(测试从 UI 向下通过多个层/依赖项运行)您可以像现在一样轻松混合不同的测试框架,但是为什么要模拟用户存储库呢?那是因为您不想访问数据库吗?

无论如何,进行您似乎想要的集成测试的一种方法是将您的解决方案配置为使用模拟 - 或者可能使用存根(创建一个返回您想要测试的数据的假用户存储库) - 您应该使用依赖框架,如Unity、 Ninject 或结构图(男孩,我们不要开始争论要使用什么框架)并让测试 url Watin 使用带有假/模拟存储库的配置启动您的站点。

另一方面,您可以对您的控制器、服务等进行单元测试。您甚至可能想尝试TDD,但这是我无法在此处介绍的另一章!

于 2011-02-01T21:11:36.667 回答
0

您没有对模拟进行任何操作以将其注入您的控制器。需要为您的控制器提供用户存储库才能使用它。

您还需要接受更多答案。

于 2011-01-27T09:22:25.443 回答