2017-09-04 5 views
0

Visual Studio for Macで、自分のコードの非表示部分をテストするためのXamarinフォームプロジェクトを参照するTestProjectをMac用にセットアップしました。XamarinユニットがXamarin.Authでポータブルベイトとスイッチエラーをテストしていますか?

私はキーチェーンにアクセスするためにXamarin.Authを活用し、私のコードの一部をテストしようとすると、私は次のエラーを取得していますが。

System.NotImplementedException : 
Portable Bait And Switch is nuget feature, so the package must be installed in all project. 

NotImplementedException will indicate that Portable Code from PCL is used and not Platform Specific 
implementation. Please check whether platform specific Assembly is properly installed. 

Cannot save account in Portable profile - bait-and-switch error. 
Please file a bug in https://bugzilla.xamarin.com 

このコードは、iOSシミュレータ上で正常に実行を動作し、私はそれがxamarinの認証は、このテストプロジェクトに存在しないIOSのキーチェーンを活用方法とは何かを持っていると仮定します。リファレンスにiosのソリューションを追加しようとしましたが、テストプロジェクトの「リファレンスの編集」ではできません。文句を言わないダイアログプロジェクト参照は、それを許可する:ここでenter image description here

は私のPCLに失敗しているコードです。

AccountStore store; 
store = AccountStore.Create(); 

どうやらそれはAccountStore.Create(とのトラブルを持っている)

ここでは、PCLを呼び出すtestcodeクラスです:ベイト

using System; 
using NUnit.Framework; 
using CrowdWisdom; 
using CrowdWisdom.Authentication; 

namespace CrowdWisdomTest 
{ 
    [TestFixture()] 
    public class AuthServiceTest 
    { 
     [Test()] 
     public void SaveRestoreSecret() 
     { 
      String secret = "ABCD"; 
      AuthService auth = AuthService.GetInstance(); 
      auth.putSecret("MySecret", secret); 
      Assert.AreEqual(secret, auth.GetSecret("MySecret")); 
    } 
    } 
} 
+2

Xamarin.Authはプラットフォーム固有のAPIを使用しているため、プラットフォーム固有のデバイスランナー(NUnitとxUnitはiOSとAndroidベースのランナーを使用する必要があります。 NONプラットフォームベースのNUnitランナーなしでテストできます。 – SushiHangover

答えて

1

そして、ほとんどのクロスプラットフォームのプラグインが使用パターンを切り替え - 非常に単体テストに優しいパターンではありません。あなたの例で見ることができます。

私の非常に最初の勧告は、お使いの承認プロセスの依存関係注入コンテナとを伴って含む、契約ベースのアプローチを使用することです。ユニットテストのコンテキストとして模擬実装を提供することができます。しかし、それが不可能な場合は、以下のハックを使用して、これらの静的クラスに対して独自のモックスイッチを提供することができます。

あなたの携帯用のコードがちょうど餌であることを意図しているXamarin.Authのポータブル版にアクセスしているので、基本的に、あなたが見るエラーです。したがって、(Xamarin.Authのプラットフォーム固有のライブラリで行ったように)単体テストのコンテキストでスイッチとして動作する独自の実装を作成する必要があります。

ことを行うためには、あなたがする必要があります。(唯一のあなたのユニットテストプロジェクトで使用されます)他の携帯のライブラリを作成します

  1. 。たとえば、名前を「Xamarin.Auth.Mocks」としましょう。そのプロパティのページで、ルート名前空間とアセンブリ名を 'Xamarin.Auth'として更新してください。

    enter image description here

  2. モックアカウントストアクラスを追加し、スイッチパターンを使用してAccountStoreを実装します。

    namespace Xamarin.Auth 
    { 
        /// <summary> 
        /// A persistent storage for <see cref="Account"/>s. This storage is encrypted. 
        /// Accounts are stored using a service ID and the username of the account 
        /// as a primary key. 
        /// </summary> 
    #if XAMARIN_AUTH_INTERNAL 
        internal abstract partial class AccountStore 
    #else 
        public abstract partial class AccountStore 
    #endif 
        { 
         public static AccountStore Create() 
         { 
          return new MockAccountStore(); 
         } 
        } 
    
        public class MockAccountStore : AccountStore 
        { 
    
        } 
    } 
    
  3. 今、あなたはあなたのユニット・テストを、あなたの携帯用のコードを実行するたびに、すべてのXamarin.Authニーズのためのあなたのモックスイッチの実装を見つけるでしょう、あなたのユニット・テスト・ライブラリー

Xamarin.Auth.Mocksへの参照を追加します。あなたはXamarin.Authから真の隔離を達成します。技術的には、単体テストを書くときに、とにかく願っているものです。

注:あなたの携帯用のコードは、あなたのXamarin.Auth.Mocksライブラリにあまりにも彼らのためにモック実装を追加し、他の餌スイッチのクラスを使用している場合。コードで使用するモッククラスのみを追加する必要があります。 Xamarin.Auth

+1

うわー、素晴らしい答え!ありがとう – user1023110

関連する問題