2009-05-19 16 views
6

benim denetleyicisiBir ISingleResult öğesini nasıl eşleştirebilirim? Yapmalımıyım? ya da daha iyi bir yöntem var mı?

public ActionResult Index() 
{ 
    using (NorthwindDataContext db = new NorthwindDatacontext()) 
    { 
     var results = db.GetRecordSets(arg1, ....).ToList(); 
     // use results as list 
    } 

    return View(); 
} 

böyle bir eylem yöntemine sahip ve bunu (inşa edilmiştir sonra başlamadan önce evet, öncesinde değil ... ama kod yazılmıştır testleri yapmaya başlamak istedi ... yani TDD kullanın)

ve ben

public delegate NorthwindDatacontext ContextBuilderDelegate(); 

public ContextBuilderDelegate ContextBuilder { get; set; } 

böyle yapıcı bir şey ekleyebilirim ... böyle kontrolöre bunun gibi bir özellik ekleyerek anladım

Bunu kullanmak için hiçbir yol buldu NorthwindDatacontext tüm yöntemler returnType olarak ISingleResult kullandıkları için
ContextBuilder =() => new NorthwindDatacontext(); 

sonra NorthwindDatacontext

var controller    = new MyController(); 
var mockDataContext   = new Mock<NorthwindDatacontext>(); 
controller.ContextBuilder =() => mockDataContext.Object; 

Ama ... bir mock ile ContextBuilder özelliğini ayarlayarak ActionMethod test edebilir ve yapamıyorum Bu arayüzle bir nesne oluşturmanın yolunu bulmak. Bu

var theResult     = new List<GetRecordSetsResult>(); 
// fill the data structure here with the provided result... 

mockDataContext.Setup(c => c. GetRecordSets()).Returns(theResult as 
              ISingleResult<GetRecordSetsResult>); 

denedim ama ISingleResult dönüştürüldüğünde theResult boş olduğu için çalışmaz.

Bu şekilde test etmek için bir ISingleResult nesnesi oluşturmanın bir yolu var mı, yoksa burada bir şeyler yapmak için yanlış bir yol yapıyorum? GetEnumerator() - Advance

+0

ile kullanımınıza son verdim. Teşekkürler, sorunuz ve ilk cevap gerçekten bana sorunu çözmeme yardımcı oldu. – Odd

cevap

3

ToList() yılında

sayesinde sadece bir üye yöntemi olduğundan, alay etmek kolaydır IEnumerable için bir uzantısı yöntemi vardır. onun yöntemleri sanal değilse

Hala o umut olur,

Neyse ki ben benim oyunumu benzer bir sorun çözüldü nasıl ..., NorthwindDataContext sınıf alay sıkıntı yaşıyor olabilir:

public class MyType 
{ 
    public virtual ISingleResult<int> ReturnSomeResult() { throw new NotImplementedException(); } 
} 

[TestMethod] 
public void TestMethod1() 
{ 
    var mockMyType = new Mock<MyType>(); 
    var mockSingleResult = new Mock<ISingleResult<int>>(); 
    IEnumerable<int> someEnumerable = new int[] {1,2,3,4,5}; 
    mockSingleResult.Setup(result => result.GetEnumerator()).Returns(someEnumerable.GetEnumerator()); 
    mockMyType.Setup(myType => myType.ReturnSomeResult()).Returns(mockSingleResult.Object); 

    Assert.AreEqual(15, mockMyType.Object.ReturnSomeResult().ToList().Sum()); 
} 
+0

Harika cevap ... Ben de öyle yapacağım. – womp

+1

Üzgünüm, burada bir aptal gibi hissediyorum çünkü sorunumu nasıl çözebileceğimi göremiyorum. İyi bir yaklaşım görüyorum ama ihtiyacım olan şeyi çözmüyor. Rob Conery'nin MVC Storefront videolarına bir göz atıyordum ve depo modelinin ihtiyacım olan şey olduğunu görebiliyorum ama bu LinqToSql Veri Bağlamları ile kolayca göremediğim gibi. –

+0

Harika cevap, sorunumu çözdü. – Odd

5

ISingleResult'u uygulayan bir sınıf oluşturdum ve sadece bir liste yazdım. Bu tür kodlamaya oldukça yeni geldim, bu yüzden bu benim için çalışırken, kendi riskinizle kullanın (ve delikleri bir yorum gönderdiyseniz görürsünüz).

class SingleResult<T>:ISingleResult<T> 
{ 
    readonly List<T> _list = new List<T>(); 

    public void Add(T item) 
    { 
     _list.Add(item); 
    } 

    #region Interface Items 

    public IEnumerator<T> GetEnumerator() 
    { 
     return _list.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    public object ReturnValue { get { return _list; } } 

    public void Dispose() { } 

    #endregion 
} 

Bu daha sonra bir sahte parçanın geri dönmek için kullanılabilir. Bu şekilde Rhino Mocks:

+0

Çok iyi, +1. Bu sınıfı birkaç değişiklikle kullanıyorum: 1. '_list',' List 'yerine 'IEnumerable '. 2. “Add” yöntemine sahip olmak yerine, sınıf kurucusunda kullanıma hazır bir koleksiyonu iletiyorum. – Konamiman

İlgili konular