2016-04-29 1 views
8

現在、私のプロジェクトの一環で、以下のようなドメインオブジェクトが存在します。テストプロパティは

public class Address 
{ 
    public virtual string HouseName { get; set; } 

    public virtual string HouseNumber { get; set; } 

    public virtual string RoadName { get; set; } 

    public virtual string Postcode { get; set; } 

    public virtual string District { get; private set; } 
} 

地区プロパティは、データベース内の計算された列です。データアクセスプロバイダ(Entity Framework)の要件により、プライベートセットが必要です。

:アドレスレコードが保存されるとき地区が原因それが更新されるまで、設定する必要はありませんので、これはデータベース

私はこのようなルックスをテストする方法で更新/通常のプログラムフローで結構です

public IEnumerable<House> GetHousesWithinSameDistrict (int addressId) 
{ 
    var addressToMatch = _addressRepository 
     .FirstOrDefault(address => address.Id == addressId) 

    return _houseRepository 
     .Where(house => house.Address.District == addressToMatch.District) 
} 

これは、私がDistrictプロパティを設定することができず、正しい一致するアドレスが返されることを確認するためのテストを書くことができないため、addressToMatch変数を設定しようとすると問題が発生します。

このテスト用にAddressオブジェクトを設定するにはどうすればよいですか?

+0

たぶん、 '保護internal' +'アセンブリ:InternalsVisibleTo'を? –

+0

@ DeblatonJean-Philippe関連、しかし確かに重複するIMHOはありません。 – Jeroen

+0

@ DeblatonJean-Philippeそれはまったく重複していません。 – FLSH

答えて

5

あなたが部品番号使用している場合、これは、箱から出して動作します(質問はタグが付いているので、私はあなたがいると仮定):

var mockAddress = new Mock<Address>(); 
mockAddress.SetupGet(p => p.District).Returns("Whatever you want to match"); 

だから、より完全な例は次のとおりです。

var mockAddress = new Mock<Address>(); 
mockAddress.SetupGet(p => p.Id).Returns(42); 
mockAddress.SetupGet(p => p.District).Returns("What you want to match"); 

var mockAddressRepository = new Mock<IRepository<Address>>(); 
var addresses = new List<Address> { mockAddress.Object }; 
mockAddressRepository.Setup(p => p.GetEnumerator()).Returns(addresses.GetEnumerator()); 

var addressToMatch = mockAddressRepository.Object.FirstOrDefault(address => address.Id == 42); 
Console.WriteLine(addressToMatch.District); 

これは期待値を出力:

What you want to match 
1

まず、野生の推測:protected internalとしてあなたDistrict properyを宣言プラスDistinctは、あなたのテストから設定することができるように、あなたの「ドメイン」アセンブリにassembly:InternalsVisibleTo属性を追加するかもしれない組み合わせ。

class Address 
{ 
    public virtual string District { get; protected internal set; } 
} 

また、あなたはDistrictプロパティの値を設定しますあなたのAddressクラス、内部コンストラクタを追加することができます。そして、あなたの「ドメイン」アセンブリにassembly:InternalsVisibleToと注釈を付けてください。

関連する問題