C# 我该把我的嘲弄放在哪里?

C# 我该把我的嘲弄放在哪里?,c#,mocking,C#,Mocking,我正在努力让mock正常工作,我想知道人们通常把他们的mock类放在哪里。我似乎有三个基本的选择,但没有一个可行 我可以将它们放在应用程序集本身中,在这种情况下,它们随应用程序一起提供,这看起来很糟糕,但它们在最终构建期间可用于单元测试,并且没有循环引用。这似乎是最简单的方法 我可以创建一个单独的模拟程序集,以便它们在单元测试期间可用,可以从应用程序和测试应用程序中使用,但我最终不得不将所有实际类型移动到此程序集,或者创建循环引用 我可以将它们放在测试程序集中,但是它们不能从应用程序本身使用,因

我正在努力让mock正常工作,我想知道人们通常把他们的mock类放在哪里。我似乎有三个基本的选择,但没有一个可行

我可以将它们放在应用程序集本身中,在这种情况下,它们随应用程序一起提供,这看起来很糟糕,但它们在最终构建期间可用于单元测试,并且没有循环引用。这似乎是最简单的方法

我可以创建一个单独的模拟程序集,以便它们在单元测试期间可用,可以从应用程序和测试应用程序中使用,但我最终不得不将所有实际类型移动到此程序集,或者创建循环引用

我可以将它们放在测试程序集中,但是它们不能从应用程序本身使用,因此我不能将它们用作构建应用程序块的过程


我倾向于尝试使用mock来帮助开发系统以及测试部件,因此我发现很难知道将它们放在哪里。此外,所有最终版本的代码都必须通过单元测试过程运行,因此我需要在构建周期中提供模拟

有没有人对模拟课程应该放在哪里有什么想法

谢谢你的帮助
T

您的模拟应该放在单元测试项目中。应用程序不应依赖于模拟对象。通常,您的应用程序将使用接口,而您的mock将实现这些接口。您的应用程序不需要也不应该引用您的测试项目。

我们在项目上所做的是识别内部的和外部的依赖关系。内部依赖项的模拟放在单元测试项目中(如果在整个解决方案中使用,则放在单独的模拟项目中)。外部依赖项的模拟进入应用程序本身,然后用于部署和集成测试

外部依赖关系是一种环境性的东西——所以,Active Directory、web服务、数据库、记录器,诸如此类的东西。依赖项注入的处理方式与此相同——外部依赖项在配置文件中定义,因此我们可以轻松地选择在运行时要使用的依赖项


内部依赖几乎是其他一切。

模拟应该保存在一个单独的项目中。我们一共有3种选择

  • 单元测试项目中的模拟

    如果UI项目需要将其用于启动(例如:模拟服务/部分集成测试/冒烟测试),则将不起作用。即使测试项目通过依赖项注入在配置文件中引用,我们也不希望将单元测试DLL带到其他环境中。现在更多的关注点是集成测试,这当然超出了这个主题,但我们应该意识到模拟不仅仅是单元测试

  • 应用程序项目本身中的模拟(应用程序中的服务模拟) 服务项目)

    开发人员可能会意外忘记删除模拟。一个新开发人员尝试模拟,但忘记将其包含在依赖项配置文件中。让我们不要把它留给机会,因为它会阻碍球队的扩张

  • 在单独的项目中模拟

    在这里,单元测试项目以及其他启动项目都可以引用这一点。使用前端的集成测试还可以模拟特定区域(例如:外部API)。或者使用mock对UI进行冒烟测试(而其他团队则部署后端)。简而言之,我们有很多选项可以使用mock。不单单局限于单元测试。 但是,最重要的好处是,当我们想要确保上线时,我们可以从部署中删除模拟项目(或dll)。这样,如果任何项目或配置文件意外引用模拟,我们会得到运行时错误。这有助于把它扼杀在萌芽状态


  • 查看
    InternalsVisibleTo
    assembly属性;它将改进您的选项:“我倾向于尝试使用mock来帮助开发系统”——这似乎有些奇怪。当然,给定的类要么是应用程序的一部分,要么是测试的一部分;但不是两者都有。@Flynn我已经在用了,谢谢@蒂姆-也许这就是我错的地方。当我有这些伟大的模拟等待使用的时候,总是不得不通过多层对话来开发我的系统,这似乎是一个巨大的耻辱。在前端工作之前,您是否发现系统的所有层都已经编码好了?这样您就永远不会使用模拟来加速和处理应用程序了?我开始在单元测试项目中使用它们,但如果我的应用程序总是要一直回到我的后端,而我的所有这些功能完美的模拟都在那里大声喊着要使用,这似乎是一种巨大的浪费。“所以你永远不会使用模拟来加速和处理你的应用程序?”不;将测试代码保留在应用程序之外。除了mock之外,你还有单元测试代码:这是不是需要使用?很抱歉这两个注释之间的重复,但是。。。单元测试代码和mock之间的关键区别在于,我的前端需要使用某种形式的后端服务和类,主要是在开发人员的其他层完成编码之前。在我的测试项目中,我已经有了一套很好的模拟工具,不能使用它们似乎是一件非常遗憾的事情。你发现在你开始前端工作之前,你下面的所有层都已经编码好了吗?@Tollo mocking框架,比如RhinoMocks,可以帮助你完成这项工作。Tim/Adriannp感谢你到目前为止的回复。Rhinomock能解决我的问题吗?把代码放在哪里?我没有看过它,但我的理解是它使模拟过程更简单,而不是解决了在开发和测试中使用模拟的问题。