我有下一个接口(interface)声明:
public interface FundaService
{
@GET( "/feeds/Aanbod.svc/json/{key}" )
Observable<JsonResponse> queryData( @Path( "key" ) String key, @Query("type" ) String type, @Query( "zo" ) String search, @Query( "page" ) int page, @Query( "pagesize" ) int pageSize );
}
我在 Retrofit 之后使用。什么是测试我在 URL 声明和查询参数中没有出错的优雅方法?
我看到我可以模拟 web 层并使用参数检查 url。
更新
我修改了它:
public interface FundaService
{
String KEY_PATH_PARAM = "key";
String FEED_PATH = "/feeds/Aanbod.svc/json/{" + KEY_PATH_PARAM + "}";
String TYPE_QUERY_PARAM = "type";
String SEARCH_QUERY_PARAM = "zo";
String PAGE_QUERY_PARAM = "page";
String PAGESIZE_QUERY_PARAM = "pagesize";
@GET( FEED_PATH )
Observable<JsonResponse> queryData( @Path( KEY_PATH_PARAM ) String key, @Query( TYPE_QUERY_PARAM ) String type,
@Query( SEARCH_QUERY_PARAM ) String search, @Query( PAGE_QUERY_PARAM ) int page,
@Query( PAGESIZE_QUERY_PARAM ) int pageSize );
}
并对其进行部分测试,例如:
public class FundaServiceTest
{
@Test
public void PathKeyIsCorrect()
throws Exception
{
assertThat( FundaService.KEY_PATH_PARAM ).isEqualTo( "key" );
}
@Test
public void FeedPathIsCorrect()
throws Exception
{
assertThat( FundaService.FEED_PATH ).isEqualTo( "/feeds/Aanbod.svc/json/{key}" );
}
}
最佳答案
您可以使用 okhttp 拦截器来检查改造构建的最终请求,而无需使用模拟 http 服务器。它使您有机会更早地检查请求。假设我们要测试以下接口(interface) -
public interface AwesomeApi {
@GET("/cool/stuff")
Call<Void> getCoolStuff(@Query(("id"))String id);
}
第一个测试运行“validateEagerly”来验证整个界面。如果您的其他测试用例没有触及所有接口(interface)方法,这很有用。第二个测试是您如何验证特定调用是否生成预期 url 的示例。
public class AwesomeApiTest {
@Test
public void testValidInterface() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.example.com/")
.addConverterFactory(GsonConverterFactory.create())
// Will throw an exception if interface is not valid
.validateEagerly()
.build();
retrofit.create(AwesomeApi.class);
}
@Test(expected = NotImplementedException.class)
public void testCoolStuffRequest() throws Exception {
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
final Request request = chain.request();
// Grab the request from the chain, and test away
assertEquals("HTTP methods should match", "GET", request.method());
HttpUrl url = request.httpUrl();
// Test First query parameter
assertEquals("first query paramter", "id", url.queryParameterName(0));
// Or, the whole url at once --
assertEquals("url ", "http://www.example.com/cool/stuff?id=123", url.toString());
// The following just ends the test with an expected exception.
// You could construct a valid Response and return that instead
// Do not return chain.proceed(), because then your unit test may become
// subject to the whims of the network
throw new NotImplementedException();
}
});
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
AwesomeApi awesomeApi = retrofit.create(AwesomeApi.class);
awesomeApi.getCoolStuff("123").execute();;
}
}
我是通过浏览 retrofit 自己的测试得到这个想法的。别人的试验往往是很大的启发!
关于android - 单元测试 Retrofit 接口(interface)声明的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33788568/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。