2017-03-10 25 views
0

私はプロパティが非仮想であり、継承の2つのレイヤーがあるメソッドをテストしようとしています - したがって私はモックを作成することはできません。私は偽物を作成しましたが、何らかの理由でプロパティ値がまだ空です。テストは、私は2つの通貨のプロパティとVAR通貨を参照してください実行しているいくつかの理由非仮想文字列プロパティをオーバーライド

public class Cart { 
    public string Currency { get; set; } // I'm trying to override this 
} 

// My fake class 
public class CartFake : Cart 
{ 
    public new string Currency { // This should hide SomeBaseBase.Cart.Currency - but it does not 
     get { return "USD"; } 
     set { value = "USD"; } 
    } 
} 


public abstract class SomeBaseBase { 
    public virtual Cart Cart { get; set; } 
} 

public class Base : SomeBaseBase { 
    public string OtherProperties { get; set; } 
} 

// class under test 
public class SomeClassFake : Base { 
    public override Cart Cart => new CartFake(); 


    // Then when test is running I have this 
    var currency = Cart.Currency // returns "" - when debugging I see two "Currency" properties and currency gets populated with "" 
} 

= USD「の代わりに」「通貨を取得します」

理由は何ですか? USDに人が住むようにするにはどうすればいいですか?

EDIT:何らかの理由でラインについては

public class CartFake : Cart 
{ 
    public CartFake() : base() 
    { 
     Currency = "USD"; 
    } 
} 

:Cart.Currencyはまだ空である:(

+5

を返すようにしたいプロパティのCartFakeオブジェクトにCartをキャストする必要があります。あなたは実際に 'Cart.Currency'を' CartFake'のコンパイル時の視点から隠していますが、それを上書きしているわけではないので、 '' Cart.Currency''を 'var currency = Cart.Currency; 'それは' FakeCart'について何も知らない。 –

+0

問題は、Cartはサードパーティのライブラリであり、私はそれを変更できないということです。これを回避する方法はありますか?私は通貨を設定しようとしましたが(plsはEDITを参照してください)、var通貨はまだ ""となります – BobSwanson

+0

これは役に立つかもしれません:http://stackoverflow.com/questions/6484/how-do-you-mock-a-sealed-クラス – john

答えて

1

ます場合、これは、どのようにシャドウイングや作品を隠し、すなわち(クラスのメンバーとnewキーワードを使用して)であります派生クラス(CartFake)の参照を基底クラス(Cart)で保持すると、派生クラス(CartFake)のプロパティの値にアクセスできますが、間違っています。

基本クラス(Cart)にvirtualというプロパティを定義し、派生クラス(CartFake)のキーワードoverrideを使用してオーバーライドした場合、そのようなことはありません。あなたは、あなたが型ベースクラスの変数を使用して、プロパティCurrencyにアクセスするが、オブジェクトの型派生クラスで実際にあるときに、今

public class Cart { 
    public virtual string Currency { get; set; } // I'm trying to override this 
} 

// My fake class 
public class CartFake : Cart 
{ 
    public override string Currency { // This should hide SomeBaseBase.Cart.Currency - but it does not 
     get { return "USD"; } 
     set { value = "USD"; } 
    } 
} 

:あなたはあなたのコードは次のようにする必要があるということのために期待されている行動については

USDが返されます。

あなたはそれがCartFakeで財産Currency定義さを隠しているタイプCartの参照を使用してCurrencyプロパティにアクセスしています。以下のようなあなたがCurrencyの結果としてUSDを取得したい場合は、バックCartFakeにキャストする必要が

// class under test 
public class SomeClassFake : Base { 
    public override Cart cart => new CartFake(); 


    // Then when test is running I have this 
    var cartFake = cart as CartFake; 
    var currency = cartFake.Currency // will return USD 
} 

はより明確にするため、質問Difference between Shadowing and Overridingを参照してください。

+0

それはものです..カート内の通貨は非仮想であり、私は第三者のライブラリを変更することはできません – BobSwanson

+0

私の更新されたポストを参照してください。 –

0

あなたは、あなたが `new`修飾子は基本的には、何を意味するのか見直す必要があるようですね

var currency = ((CartFake)Cart).Currency; 
+0

いいえ、それは動作しません。私はBaseクラスを変更できません。私は単体テストの目的でSomeClassFakeを作成しました – BobSwanson

関連する問題