![]() |
1
9
就我个人而言,我不在乎这个。测试应该确保代码按照您的意愿执行。 很难测试代码是什么 不 做 在这种情况下我不会麻烦的。 测试实际上应该如下所示:
我是说,这是你正在测试的一行代码。 |
![]() |
2
3
你为什么不嘲笑
如果你嘲笑
如果这是一个完全荒谬的想法,你能解释一下为什么吗?老实说,我想学。 |
![]() |
3
3
单元测试的一种思维方式是作为编码规范。当你使用
这是您的测试所验证的。它是未指定的,因为它没有提到是否允许修改。如果我们说
然后我们得到一个关于捕获错误所需的测试更改的提示:
(变化是我们从新创建的产品中检索所有者,并从服务返回的产品中检查所有者。) 这体现了这样一个事实:所有者和其他产品属性必须等于生成器的原始值。这看起来像是我在说明显的,因为代码非常简单,但是如果您从需求规范的角度考虑,它运行得相当深入。 我经常“测试我的测试”,规定“如果我更改这行代码,调整一两个临界常数,或者注入一些代码脉冲(例如更改!)=to==),哪个测试将捕获错误?”如果有一个测试捕捉到了问题,那么做是为了真正的发现。有时不是,在这种情况下,是时候看一下测试中隐含的需求,然后看看我们如何收紧它们。在没有实际需求捕获/分析的项目中,这是一个有用的工具,可以加强测试,使其在发生意外变化时失败。 当然,你必须务实。你不能合理地期望处理所有的变更——有些只是荒谬的,程序会崩溃。但是,像所有者变更这样的逻辑变更是加强测试的好候选者。 通过将需求的讨论拖拽到一个简单的代码修复中,有些人可能认为我走到了最深处,但是彻底的需求有助于产生彻底的测试,如果您没有需求,那么您需要加倍努力来确保您的测试是彻底的,因为您在编写测试时隐式地执行需求捕获。 编辑:我是在回答问题的限制范围内回答这个问题的。如果可以自由选择,我建议不要使用EntityGenerator创建产品测试实例,而是“手工”创建它们,并使用相等比较。或者更直接地,将返回产品的字段与测试中的特定(硬编码)值进行比较,同样,在测试中不使用EntityGenerator。 |
![]() |
4
2
呃……啊……啊……啊…… 问题1:不要更改代码,然后编写一个测试。首先为预期的行为编写测试。然后你可以做任何你想做的事情。
问题2:您不会在
但是如果你坚持,那就听你的测试。他们告诉您,您有可能从拥有不正确所有者的网关中提取产品。噢,看起来像是商业规则。应该在模型中进行测试。
还有你用的模拟。为什么要测试实现细节?网关只关心
如果您以这种方式测试,您将创建脆弱的测试。如果产品进一步改变怎么办?现在到处都是不及格的测试。
您的产品(模型)消费者是唯一关心
所以您的网关测试应该如下所示:
不要把业务逻辑放在它不属于的地方!它的推论是不要在没有业务逻辑的地方测试业务逻辑。 |
![]() |
5
1
如果您真的想保证服务方法不会改变您产品的属性,您有两个选择:
下面是我对nmock的处理方法:
|
![]() |
6
1
我之前的回答是这样的,尽管它假定您关心的产品类的成员是公共的和虚拟的。如果类是POCO/DTO,则不太可能出现这种情况。 您要查找的内容可能会被重新表述为一种比较对象值(而不是实例)的方法。 一种比较的方法,看看它们在序列化时是否匹配。我最近做这个是为了一些代码…正在用参数化对象替换长参数列表。代码很简单,但我不想重构它,因为它很快就会消失。所以我只做这个序列化比较作为一个快速的方法来看看它们是否具有相同的值。 我写了一些实用函数…assert2.issameValue(预期值,实际值),其功能类似于nunit的assert.areequal(),但在比较之前它通过json序列化。同样,可以使用it2.issameSerialized()来描述以类似于moq.it.is()的方式传递给模拟调用的参数。
|
![]() |
7
0
好吧,一种方法是传递一个模拟的产品,而不是实际的产品。通过严格要求来验证没有任何影响产品的因素。(我想你是在使用MOQ,看起来是这样的)
也就是说,我不确定你应该这么做。测试做了很多工作,可能表明在某个地方还有另一个需求。找到那个需求并创建第二个测试。也许你只是想阻止自己做傻事。我不认为那是天平,因为你能做那么多蠢事。尝试测试每一个都会花费太长时间。 |
![]() |
8
0
我不确定单元测试是否应该关注“给定方法的作用”
不
“。有无数的步骤是可能的。严格来说,测试“getproduct(id)返回与productrepository上getproduct(id)相同的产品”是正确的
但是,您可以创建一个测试(如果需要)“getproduct(id)return product with same content as getproduct(id)on productrepository”(getproduct(id)return product),您可以在其中创建一个产品实例的(适当深度)克隆,然后应该比较两个对象的内容(因此没有object.equals或object.referenceequals)。 单元测试不能保证100%没有错误和正确的行为。 |
![]() |
9
0
您可以将接口返回到产品,而不是具体的产品。 如
然后验证未设置所有者属性:
如果您关心所有的属性和或方法,那么Rhino可能有一个预先存在的方法。否则,您可以创建一个可能使用反射的扩展方法,例如:
我们的行为规范如下:
享受。 |
![]() |
10
0
如果productService.getProduct()的所有使用者都希望得到与从productRepository请求相同的结果,为什么不直接调用productRepository.getProduct()本身呢? 你好像有一个不想要的 Middle Man 在这里。 没有为productService.getProduct()添加太多的值。转储它,让客户机对象直接调用productrepository.getproduct()。将错误处理和日志记录到productrepository.getproduct()或使用者代码(可能通过AOP)。 不再有中间人,不再有差异问题,不再需要测试这个差异。 |
![]() |
11
0
我来说明一下我看到的问题。
所以实际上,您正在创建一个测试,该测试在服务层返回数据源后验证数据源中的数据是否与提取的对象中的数据匹配。这可能属于“集成测试”的范畴。 在这种情况下,你没有很多好的选择。最后,您希望知道每个属性都与一些传入的属性值相同。所以你必须独立测试每个属性。您可以通过反射来实现这一点,但对于嵌套集合来说,这并不理想。
我认为真正的问题是:为什么要测试您的服务模型以确保数据层的正确性,为什么在服务模型中编写代码只是为了破坏测试?您是否担心您或其他用户可能会在服务层中将对象设置为无效状态?在这种情况下,你应该改变你的合同,使产品的所有者
您最好对数据层编写一个测试,以确保它正确地获取数据,然后使用单元测试来检查服务层中的业务逻辑。如果您对这种方法的更多细节感兴趣,请在评论中回复。 |
![]() |
12
0
查看所有提供的4个提示后,您似乎希望在运行时使对象不可变。C语言不支持这一点。只有重构产品类本身才有可能。对于重构,您可以
所以,我看到确保对象具有相同内容的唯一正确方法是比较它们。可能最简单的方法是
|
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |