SORU
7 Aralık 2013, CUMARTESİ


Nasıl benim için bir SQL dizesi oluşturmak için esqueleto alabilir miyim?

Nasıl from ifadesinden bir SQL dizesi oluşturmak için esqueleto alabilir miyim?

toRawSql belgelerine diyor ki, "sadece sorgu kalıcı günlüğü olabilir". Benim anlayabildiğim MonadLogger tüm olası formları çalıştım, ama asla herhangi bir SQL basılmış. Aynı belgeleri de diyor ki "bu işlevi kullanarak el ile ... mümkün ama sıkıcı bir iştir". Ancak, bu tür, ne de herhangi bir fonksiyon türü, QueryType değerler dönen yok kurucular verilir. QueryType newtype olduğunu fark ve unsafeCoerce kullanarak bu geçici başardı!

Ayrıca SQL oluşturmak için bir veritabanına bağlanmak için gerek yok olsa bile Connection bir SQLite üzerinden aldım) sağlamak zorunda kaldım.

Bu ne buldum. Daha iyi bir yolu olmalı.

withSqliteConn ":memory:" $
    \conn -> return $ toRawSql SELECT
                               (unsafeCoerce ((const mempty)
                                  :: a -> Text.Lazy.Builder.Builder))
                               (conn, initialIdentState) myFromStatement)

http://hackage.haskell.org/package/esqueleto-1.3.4.2/docs/Database-Esqueleto-Internal-Sql.html

CEVAP
20 Kasım 2012, Salı


Eğer RoboGuice ve birim testi için kurulum adımları ile ilgili bir sorun varsa, ne yazık ki, bu tür bir hata alabilirsiniz. Sihirli bir kısa cevap, ama oldukça tam takip adımlar bir dizi.

BTW, 1.1 - AbstractAndroidModule & RoboUnitTest artık RoboGuice 2.0 var RoboGuice kullanıyorsun. RoboGuice 1.1 önerilmiyor, en iyi genel çözüm yeni sürüm taşımaktır bu talimatları Upgrading to 2.0 göre.

Ancak, her ihtimale karşı RoboGuice bağlısın 1.1, burada bazı adımları takip etmek

  • İnşa dosyaları değiştirerek paket isimleri yeniden düzenleme/sonra oluşturulan kodu/etc tutarsız yok. Oluşturulan kodu silin, Temiz Ve yeni bir proje Oluşturmak bile yeniden kopyalayın ve kaynak dosyaları.
  • Bir proje uygulama kodunuzu (RoboGuice bağımlı, Gereçleri/RoboUnitTestCase/AndroidMock bağımsız). Uygulama kodu proje lib içinde vardır: guice-2.0-no_aop.jar ve roboguice-1.1.2.jar.
  • Başka bir projede birim test kod başvurular (/bağımsız Gereçleri RoboGuice RoboUnitTestCase/AndroidMock bağımsız). Talimatları burada 20**. Test kodu projenizin lib içinde vardır: AndroidMockGenerator.jar.
  • Uygulama Projesi, Uygulama Modül derslerine şöyle bir şey:

    package com.mypackage;
    
    import android.app.Instrumentation;
    import android.content.Context;
    
    public class MyApplication extends roboguice.application.RoboApplication {
    
    static MyModule myModule;    
    
    // this constructor usually called by app
    public MyApplication(Context context) {
        super();
        attachBaseContext(context);
    }
    // This constructor called by unit tests.  This is unfortunately small amount of 
    // 'abstraction leakage' of unit test needs into app code.
    public MyApplication(Instrumentation instrumentation) {
        super();
        attachBaseContext(instrumentation.getContext());
    }    
    public static void setModule(MyModule module) {
        MyApplication.myModule = module;
    }   
    public static MyModule getModule() {
        return MyApplication.myModule;
    }   
    }
    

    Ve

    package com.mypackage;
    
    public class MyModule extends roboguice.config.AbstractAndroidModule {
    // this will be injected
    protected UsefulObject myUsefulInstance;    
    
    public void setUsefulObject(UsefulObject usefulInstance) {
        this.myUsefulInstance = usefulInstance;
    }    
    public UsefulObject getUsefulObject() {
        return this.myUsefulInstance;
    }    
    
    @Override
    protected void configure() {
        bind(UsefulObject.class).toInstance(myUsefulInstance);
    }
    

    }

  • Projesinin içinde test case sınıf şuna benzer:

    import android.test.suitebuilder.annotation.LargeTest;    
    import com.mypackage.MyApplication;    
    import com.mypackage.MyModule;    
    import com.mypackage.UsefulObject;    
     //import com.mypackage.UsefulObjectSimpleImplementation;    
    import android.test.suitebuilder.annotation.MediumTest;    
    import android.test.suitebuilder.annotation.SmallTest;    
    import com.google.android.testing.mocking.AndroidMock;    
    import roboguice.test.RoboUnitTestCase;
    
    public class TestMyModule extends RoboUnitTestCase<MyApplication> {
    
    @Override
    protected void setUp() throws Exception {
        UsefulObject instance = // new UsefulObjectSimpleImplementation(); 
                                AndroidMock.createNiceMock(UsefulObject.class);           
        MyModule mockModule = new MyModule();
        mockModule.setUsefulObject(instance);
        MyApplication.setModule(mockModule);
        super.setUp();
    }
    
    // Make sure you use one of the @*Test annotations AND begin
    // your testcase's name with "test"
    @MediumTest
    public void test01() {
        AndroidMock.expect(MyApplication.getModule().getUsefulObject().
             simpleMethod()).andStubReturn("Hello!");
    }
    

    }

  • Test proje için, androidmanifest.xml dosyayı aşağıdaki giriş olduğundan emin olun:

   <instrumentation android:name="android.test.InstrumentationTestRunner"
     android:targetPackage="com.mypackage"
     android:label="Tests for com.mypackage"/>
  • Test çalışan, emülatör başladı ve çalıştığından emin olmak, sağlıklı, farklı, basit bir çalışan tarafından "Hello World" uygulaması. ilk önce Bu başarılı olduğunda, daha sonra uygulamanızı çalıştırın. Son olarak, test projenizi çalıştırın.

Bundan sonra çalışması gerekir. İyi şanslar ve bana bildirin!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Joanna Okrajni

    Joanna Okraj

    4 EYLÜL 2010
  • o0oCyrusViruso0o

    o0oCyrusViru

    11 Mart 2008
  • PhoneBuff

    PhoneBuff

    10 HAZİRAN 2011