2016-08-09 3 views
2

NUnitの3.4.1、JustMock 2016.2.713.2私のモックで大文字と小文字を区別しない文字列を扱うことはできますか?

は、私がテスト対象のクラスを持っている:それは作品

[Test] 
public void GetAppSets_Returns_ValidValue() { 

    const string subkey = @"SOFTWARE\Autodesk\AutoCAD"; 
    /* The sets of applications which are based on 
    * AutoCAD 2009-2017. */ 
    string[] fakeSets = new[] { "R17.2", "R18.0", 
     "R18.1", "R18.2", "R19.0", "R19.1", "R20.0", 
     "R20.1","R21.0" }; 

    RegistryKey rk = Mock.Create<RegistryKey>(); 

    Mock.Arrange(() => rk.GetSubKeyNames()).Returns(
     fakeSets); 

    Mock.Arrange(() => Registry.LocalMachine.OpenSubKey 
    (subkey, false)).Returns(rk); 

    AppManager appMng = new AppManager(); 
    string[] appSets = appMng.GetAppSets(); 

    Assert.AreEqual(fakeSets, appSets); 
} 

:また

public class AppManager { 
    public string[] GetAppSets() => Registry.LocalMachine 
     .OpenSubKey(@"SOFTWARE\Autodesk\AutoCAD", false) 
     ?.GetSubKeyNames(); 
} 

、私はGetAppSetsメソッドのテストを持っています。 appSets変数はnull場合は次のようになります。GetAppSets方法は「ソフトウェア\オートデスク\ AutoCADの」または「ソフトウェア\オートデスクの\ AutoCADの」の代わりに文字列「S OFTWARE \オートデスク\ AutoCADの」を使用している場合でも、私のテストは失敗になります文字列の大文字と小文字は変更されます(そのレジストリキーはコンピュータに存在しないためです)。

ので、この場合にいずれかテスターは大文字小文字を区別しない文字列のようなパラメータを処理するために、GetAppSetsメソッドの実装(悪いバリアント)を知っているまたはを必要とします。

第2の変種は使用できますか?元の質問へ

答えて

0

@Karolisによって答えはのポイントを見逃しているようです質問。

正解は大文字と小文字を区別しないようにキーと一致する配置で整合を使用することである:上記mockKey

var mock = Mock.Create<RegistryKey>(); 
    Mock.Arrange(() => Registry.LocalMachine.OpenSubKey(
     Arg.Matches<string>(s => StringComparer.OrdinalIgnoreCase.Equals(s, @"SOFTWARE\Autodesk\AutoCAD")), 
     Arg.AnyBool) 
    ).Returns(mock); 


    var mockKey = Registry.LocalMachine.OpenSubKey(@"software\autodesk\autocad", false); 

ため引数整合の、mockと同じインスタンスであろう最初の議論で。

1

回答:

あなたは平等アサーションのオーバーロードされたバージョンを使用することができます。

Assert.AreEqual(fakeSets, appSets, true); 

署名:

public static void AreEqual(
string expected, 
string actual, 
bool ignoreCase) 

出典:更新された質問へのhttps://msdn.microsoft.com/en-us/library/ms243448.aspx

回答:

for(int i = 0; i < appSets.Length, i++) 
{ // If there is mismatch in length Exception will fail the test. 
    Assert.AreEqual(fakeSets[i], appSets[i], true); 
} 
+0

いいえ、私の問題はその他です。文字列の大文字小文字が変更された場合(そのレジストリキーが私のコンピュータ上に存在しないため)、 'appSets'は' null'になります。今私の話題にこの追加情報を追加しました。 –

+0

私はあなたのポイントを見ます。これはあなたのタグに記載されているように単体テストであるため、レジストリなどの他のコンポーネントとの相互作用は許可されています。 GetAppSetsにもモックを使用してください。 – Karolis

+0

私は私のテストで私の 'GetAppSets'のためのモックを使用します。私はNUnitとJustMockフレームワークを使用します。 –

関連する問題