我目前正在开发一个使用 bloc 架构的应用程序。我的集团专门使用流与 UI 进行通信。因此,除了构造函数之外,它的所有方法都是私有的(它们以“_”开头)。
所以问题是如何从文本包中的测试类中测试 bloc 的私有方法,使其无法访问其他包的私有方法。
谢谢
我正在尝试在单元测试项目中测试私有方法.到目前为止,它变得很棒,但是当我必须使用out参数测试方法时,我遇到了一个问题.该方法的签名是:
private bool GotSSI(out SSI ssi, RSI rsi)
{
~code omitted~
}
Run Code Online (Sandbox Code Playgroud)
unittest(不工作的部分)看起来像这样:
SSI ssi = null;
object[] p = new object[]{ssi,rsi};
Type[] t = new Type[] { typeof(SSI).MakeByRefType(), typeof(RSI) };
actual = (bool) privateTarget.Invoke("GotSSI",t,p);
Run Code Online (Sandbox Code Playgroud)
GotSSI方法有效.我已经在单元测试中以调试模式测试了它,我可以看到'ssi'out变量在方法内设置,然后返回它的true或false值.但是当测试返回到它自己的代码时,'ssi'变量仍为null.所以问题是我在"GotSSI"方法中创建的对象没有从PrivateObject调用方法中解析出来.
谁知道我错过了什么?
更新(拉法尔解决方案)
Rafal的解决方案完美无缺,这就是我实施解决方案的方式.
我创建了一个代表:
delegate bool GotSSIInternal(out SSI ssi, RSI rsi);
Run Code Online (Sandbox Code Playgroud)
当我创建了我想要测试的对象时,我构建了委托(目标是我正在测试的对象):
GotSSIInternal gotSSIInternal = (GotSSIInternal) Delegate.CreateDelegate(
typeof (GotSSIInternal),
target,
typeof(OfflineResolver).GetMethod("GotSSI", BindingFlags.NonPublic | BindingFlags.Instance));
Run Code Online (Sandbox Code Playgroud)
之后调用委托非常简单:
actual = gotSSIInternal.Invoke(out ssi, rsi);
Run Code Online (Sandbox Code Playgroud)
解决方案非常简单,就像一个魅力.
我有一个类,负责将合同从CSV导入数据库.
类本身只有一个开始导入的公共方法,而其他方法都是私有的(因为只有类本身才会使用,并且它们保持逻辑).
我开始使用Spock为这个类进行测试,并且有许多私有方法,我该如何测试它?
我应该把它们变成公开测试吗?只测试主要方法,公共方法?
什么是最好的?
我有这样的情况.我有一些第三方特征(我不想测试)我有我的特性使用这个特性,在某些情况下运行第三方特征方法(在下面的例子我总是运行它).
当我有这样的代码:
use Mockery;
use PHPUnit\Framework\TestCase;
class SampleTest extends TestCase
{
/** @test */
public function it_runs_parent_method_alternative()
{
$class = Mockery::mock(B::class)->makePartial();
$class->shouldReceive('fooX')->once();
$this->assertSame('bar', $class->foo());
}
protected function tearDown()
{
Mockery::close();
}
}
trait X {
function foo() {
$this->something->complex3rdpartyStuff();
}
}
trait Y2 {
function foo() {
$this->fooX();
return 'bar';
}
}
class B {
use Y2, X {
Y2::foo insteadof X;
X::foo as fooX;
}
}
Run Code Online (Sandbox Code Playgroud)
它会工作正常,但我不希望代码组织这样.在上面的类I代码中使用两个traits,但在代码中我想测试其实trait使用开头提到的其他特性.
但是当我有这样的代码时:
<?php
use Mockery;
use PHPUnit\Framework\TestCase;
class SampleTest extends TestCase
{
/** …Run Code Online (Sandbox Code Playgroud) 我自己一直在研究一个比较大的系统,这是我第一次使用大型系统(同时处理200多个信息通道).我知道如何使用Junit测试每种方法,以及如何测试边界条件.但是,对于系统测试,我需要测试所有接口,也可能需要进行一些压力测试(可能还有其他事情要做,但我不知道它们是什么).我是测试世界的新手,请给我一些建议或指出一些关于优秀的代码测试人员如何进行系统测试的信息.
PS:我有两个具体问题:如何测试私人功能?如何测试界面并避免副作用?
我有一个要求,我必须调用抽象类的私有方法.
假设抽象类如下所示: -
public abstract class Base {
protected abstract String getName();
private String getHi(String v) {
return "Hi " + v;
}
}
Run Code Online (Sandbox Code Playgroud)
有些人可以告诉我有没有办法可以打电话getHi(可能是通过Reflection或其他方式),以便我可以测试出来?我正在使用Junit 4.12和Java 8
我已经解决了这个问题,但这里的方法在抽象类中并不是私有的.
我也经历过这个问题,即使这个问题也没有谈到抽象类中的私有方法.
我不是在这里问我们是否应该测试私有方法或者测试私有方法的最佳策略是什么.网上有很多关于此的资源.我只是想问一下如何在java中调用抽象类的私有方法.
我想测试GetParameters()断言返回值包含值中的"test =".不幸的是,负责这个的方法是私有的.有没有办法为此提供测试覆盖?我遇到的问题如下:
if (info.TagGroups != null)
Run Code Online (Sandbox Code Playgroud)
问题是我的测试中info.TagGroups等于null
谢谢,
测试
[Test]
public void TestGetParameters()
{
var sb = new StringBuilder();
_renderer.GetParameters(sb);
var res = sb.ToString();
Assert.IsTrue(res.IndexOf("test=") > -1, "blabla");
}
Run Code Online (Sandbox Code Playgroud)
实现类来测试
internal void GetParameters(StringBuilder sb)
{
if (_dPos.ArticleInfo != null)
{
var info = _dPos.ArticleInfo;
AppendTag(sb, info);
}
}
private static void AppendTag(StringBuilder sb, ArticleInfo info)
{
if (info.TagGroups != null) // PROBLEM - TagGroups in test equals null
{
foreach (var tGroups in info.TagGroups)
{
foreach (var id in tGroups.ArticleTagIds) …Run Code Online (Sandbox Code Playgroud) 我想模拟super调用,特别是一些ES6类中的构造函数.例如
import Bar from 'bar';
class Foo extends Bar {
constructor(opts) {
...
super(opts);
}
someFunc() {
super.someFunc('asdf');
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的测试中,我想做类似的事情
import Foo from '../lib/foo';
import Bar from 'bar';
describe('constructor', function() {
it('should call super', function() {
let opts = Symbol('opts');
let constructorStub = sinon.stub(Bar, 'constructor');
new Foo(opts);
sinon.assert.calledWith(constructorStub, opts);
});
})
describe('someFunc', function() {
it('should call super', function() {
let funcStub = sinon.stub(Bar, 'someFunc');
let foo = new Foo(opts);
foo.someFunc();
sinon.assert.calledWith(funcStub, 'asdf');
});
})
Run Code Online (Sandbox Code Playgroud) 我在控制器中有一个私有方法
private
def body_builder
review_queue = ReviewQueueApplication.where(id: params[:review_queue_id]).first
...
...
end
Run Code Online (Sandbox Code Playgroud)
我只想测试该body_builder方法,它是一种为 rest 客户端 api 调用构建有效负载的方法。但是,它需要访问参数。
describe ReviewQueueApplicationsController, type: :controller do
describe "when calling the post_review action" do
it "should have the correct payload setup" do
@review_queue_application = ReviewQueueApplication.create!(application_id: 1)
params = ActionController::Parameters.new({ review_queue_id: @review_queue_application.id })
expect(controller.send(:body_builder)).to eq(nil)
end
end
end
Run Code Online (Sandbox Code Playgroud)
如果我运行上面的它会发送body_builder方法,但它会中断,因为参数没有像在调用操作时那样正确设置。
我总是可以为该body_builder方法创建一个条件参数,以便它接受一个参数,或者它将使用这样的参数def body_builder(review_queue_id = params[:review_queue_id])然后在测试中controller.send(:body_builder, params),但我觉得更改代码以使测试通过是错误的,它应该只是测试它照原样。
在将私有方法发送给控制器之前,如何将参数输入控制器?
我必须为 C# 中的抽象类中的内部或私有方法编写单元测试。考虑一下:
Public Abstract Class MyAbstractClass
{
Private String MyMethod()
{
//Do Something
return "HI";
}
}
Run Code Online (Sandbox Code Playgroud)
还有,我的测试方法:
public void MyTestMethod()
{
var testProcessor = new Mock<MyAbstractClass>
{
CallBase = true
};
var privateType = new PrivateType(typeof(MyAbstractClass));
PrivateObject privateObject = new PrivateObject(testProcessor , privateType);
var resValue = (String)privateObject.Invoke("MyMethod");
Assert.AreEqual(resValue ,"HI");
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行测试方法时,出现以下错误:
System.Reflection.TargetException: Object does not match target type.
Run Code Online (Sandbox Code Playgroud)
怎么解决呢?
unit-testing ×5
c# ×3
java ×3
junit ×3
testing ×3
.net ×1
controller ×1
ecmascript-6 ×1
flutter ×1
interface ×1
javascript ×1
junit4 ×1
mocha.js ×1
mockery ×1
moq ×1
php ×1
phpunit ×1
reflection ×1
rspec ×1
sinon ×1
spock ×1