6

ご覧のとおり、データを結合して新しいオブジェクトを作成する次のlinqクエリを作成しました。

 var translations = from t in context.Translations
                            join token in context.Tokens on t.Guid equals token.Guid
                            join t2 in context.Translations on new { t.Guid, LanguageCode = "fr" } equals new { t2.Guid, t2.LanguageCode} into j //TODO: fr needs to be replaced by the language of the translators account
                            from j2 in j.DefaultIfEmpty()
                           where t.LanguageCode == String.Empty
                           orderby t.Text
                           select new TranslationView
                                    {
                                        Guid = t.Guid,
                                        LanguageCode = j2.LanguageCode,
                                        SourceText = t.Text,
                                        Translation = j2.Text,
                                        IsNew = j2.Text == null,
                                        Notes = token.Notes,
                                        Required = token.Required,
                                        Type = (Token.TokenType)token.Type, 
                                        Location = (Token.LocationType)token.Location
                                    };

問題は、Rhino.Mocksを使用して単体テストを作成しようとすると、エラーが返されることです。Object reference not set to an instance of an object.

だから私の質問は、このクエリを書くことができるより良い方法はありますか?実際の状況とユニットテストの状況の両方で機能する方法はありますか?

ビットに値を渡してみたところDefaultIfEmpty()、Mockで機能するようになりましたが、メインコードが失敗しました。

ユニットテストコードの編集:

  [Test]
    public void Build_Translation_List_TwoItems_Context()
    {
        //Arrange: Setup context
        var context = setupContext();

        //Act: Pass the context through
        var result = TranslationHelpers.BuildTranslationList(context, 1);

        //Result
        result.TranslationList.Count.ShouldEqual(2);
        result.PagingInfo.TotalItems.ShouldEqual(2);
    }

SetupContextメソッド:

  public static ITranslationContext setupContext()
    {
        var context = new Mock<ITranslationContext>();
        context.SetupProperty(x => x.Tokens, new UnitTestHelpers.FakeDbSet<Token>
                                                {
                                                    new Token
                                                        {
                                                            DateAdded = DateTime.Now,
                                                            Guid = Guid.Parse("f3099a43-e12d-4ea3-ba06-265fde807f03"),
                                                            LastUpdated = DateTime.Now,
                                                            Location = (short)0,
                                                            Type = (short)0,
                                                            LocationDescription = "Test 1",
                                                            Notes = "Testing 1",
                                                            Required = "Testing"
                                                        },

                                                    new Token
                                                        {
                                                            DateAdded = DateTime.Now,
                                                            Guid = Guid.Parse("7D6937D8-F7E1-4B92-934E-465683874B65"),
                                                            LastUpdated = DateTime.Now,
                                                            Location = (short)0,
                                                            Type = (short)0,
                                                            LocationDescription = "Test 3",
                                                            Notes = "Testing 3",
                                                            Required = "Testing"
                                                        },

                                                });
        context.SetupProperty(x => x.Translations, new UnitTestHelpers.FakeDbSet<Translation>
                                                    {
                                                        new Translation{Guid = Guid.Parse("f3099a43-e12d-4ea3-ba06-265fde807f03"), LanguageCode = String.Empty, Text = "Testing 1"},
                                                        new Translation{Guid = Guid.Parse("f3099a43-e12d-4ea3-ba06-265fde807f03"), LanguageCode = "fr", Text = ""},
                                                        new Translation{Guid = Guid.Parse("7D6937D8-F7E1-4B92-934E-465683874B65"), LanguageCode = String.Empty, Text = "Testing 3"},
                                                        new Translation{Guid = Guid.Parse("7D6937D8-F7E1-4B92-934E-465683874B67"), LanguageCode = "fr", Text = "Testing 4"}

                                                    });
        return context.Object;
    }

どんな助けでも大歓迎です。

4

2 に答える 2

4

DefaultIfEmpty()「デフォルト」のj2は作成されません。j2がnullの場合でも、データを取得するだけです。

SQLのようなものですLEFT JOIN

したがって、NREを回避するには、nullをテストする必要があります。

それ以外の

LanguageCode = j2.LanguageCode

やってみてください

LanguageCode =j2 != null ? j2.LanguageCode : string.Empty // or null
于 2012-07-19T11:52:33.050 に答える
0

モックされたコンテキストをメソッドに渡すと、LINQがその役割を果たします。次に、返されたTranslationViewオブジェクトのリストを確認します。

テストは次のようになります。

List<Translations> translations = // create translations
List<Tokens> tokens = // create tokens
var context = MockRepository.GenerateStub<IMyContext>();            
context.Stub(c => c.Translations).Return(translations);
context.Stub(c => c.Tokens).Return(tokens);

var foo = new Foo(context);
var views = foo.GetTranslationView();
// verify returned views
于 2012-07-19T11:37:25.320 に答える