2012-07-24 22 views
6

benim uygulamayı test ünitesine Microsoft.Office.Interop.Excel.Range (ve diğer Microsoft.Office.Interop.Excel arayüzleri) alay etmek istiyorum. C# ile .NET 4 ile 4.0 4.010 Moq kullanıyorum. kodundaNasıl Microsoft.Office.Interop.Excel.Range Moq ile alay?

 var range = new Mock<Microsoft.Office.Interop.Excel.Range>(); 
     range.Setup(r => r.get_Value(1)).Returns("Something"); 

     var classBeingTested = new MyClass(range.Object); 

birim test olmak şöyle, ben Range kullanıyorum: Benim birim testinde

, ben şöyle mock davranışını kurmaya

public MyClass(Range range) 
    { 
     var value = range[1].ToString(); 
    } 
Bu alay et uygulayabilirsiniz nasıl

 Error: Missing method 'instance object [My.Example.Implementation.MyClass] Microsoft.Office.Interop.Excel.Range::get__Default(object,object)' from class 'Castle.Proxies.RangeProxy'. 

: testi çalışır

, aşağıdaki istisna üretir g başarıyla mi? Excel Interop işlevselliğini https://stackoverflow.com/a/9486226/1548950 gibi bir desenle yalıtmanın olası bir çözüm olduğunu anlıyorum; Ancak, Microsoft.Office.Interop.Excel arabirimlerinden alay oluşturabilmek sayesinde daha mutlu olurdum.

DÜZENLEME: Bu sorunla

TAMAM hakkında daha fazla ayrıntı, bu garip. Jimmy_keen'in önerisini test etmek için bir proje hazırladım. İşe yarıyor. jimmy_keen önerisi diğer projeler üzerinde iyi çalıştı bu yana

Error: Missing method 'instance object [My.Example.Implementation.MyClass] Microsoft.Office.Interop.Excel.Range::get__Default(object,object)' from class 'Castle.Proxies.RangeProxy'. 

, ben yanlış bir şey olduğunu şüphe başladı: Ben ile sorunları vardı projeyi test etmek aynı öneriyi kullandığınızda Ancak, aşağıdaki istisna atar proje ile kodu test ediyorum. http://www7.zippyshare.com/v/70834394/file.html

problemin kök proje başka bir sınıf (yani birim test ediliyor değildir) esasen aşağıdaki kodla içerdiğini gibi görünüyor:

Yani, sorunu ayrıntılarıyla gösteren bir deney çözüm yarattı
using Microsoft.Office.Interop.Excel; 
namespace Project 
{ 
    public class UnTestedClass 
    { 
     public UnTestedClass(Worksheet sheet) 
     { 
      var foo = sheet.Range["Description"].Column; 
     } 
    } 
} 

bu soruna neden neden ben hiç birim testinde UnTestedClass kullanmıyorum, çünkü anlamıyorum. Moq'u nasıl kullanmam gerektiğiyle ilgili bir şeyi mi özledim yoksa bir hataya rastladım mı?

+0

1 Bu garip, ben COM nesneleri ile ilgisi vardır tahmin ediyorum. Ben excel birlikte çalışma referans olarak kısa sürede, artık bu konuda bazı çalışmadan sonra Garip benim Moq kütüphane ... ... – jsmith

+0

referans verebilir, şimdi kendi ile Microsoft.Office.Interop.Excel işlevselliği izole doğru hareket ediyorum Microsoft.Office.Interop.Excel. * alay etmek yerine özel sınıflar ve arabirimler. Bu sorunun cevabı Microsoft.Office.Interop.Excel alay acil sorunları çözmek etmese de. * sonuçta sadece yararlı hale getirmek için çok fazla ayar çalışma gerektirir başladı. –

cevap

5

Kodunuz dizinleyicisi erişir, ve sizin alay etmek gerekenler: Range dizin aslında iki parametre alır

var range = new Mock<Microsoft.Office.Interop.Excel.Range>(); 
range.Setup(r => r[1, It.IsAny<object>()]).Returns("something"); 

Not o - çağrısında dolayısıyla It.IsAny<object>() kısıtlamayı.

+0

Teşekkürler, bunu test ettim ve bazı durumlarda çalışıyor. Ancak, üzerinde çalıştığım birim testi hala inatla işe reddediyor. Ben http://www7.zippyshare.com/v/70834394/file.html –

+2

@LauriHarpf de yükledim test çözümü bakın: Bu çok ilginç. Görünüşe göre derleyici tarafından oluşturulan bir kod "sorun".* Project * 'inizdeki derleyici tarafından oluşturulan 'Range' tipi arabirim, fazladan bir özelliğe sahiptir (' Column', yani). Bunun Castle için sorun yaratabileceği konusunda hiçbir fikrim yok ... ama bu COM. Örneklerinizi ILSpy ile kontrol edecekseniz, ne demek istediğimi görürsünüz. Derleyici tarafından oluşturulan kod farklıdır (sınıflar bile aynıdır) ve bu sorun olmalıdır. Eğer range.Setup (r => r.Column) .Returns (0); 'bu testi de geçersiniz. –

+1

Mükemmel, teşekkürler! ILSpy ucu da altınydı; Gerçek projemde, Sütun'a ek olarak görünen diğer ekstra özellikleri görüyorum. Mevcut "Sütun", "Sütunlar", "Satır", "Satırlar" ve "Değer" dir. Bu davranış muhtemelen herhangi bir birim testini oldukça kırılgan yazacağım, çünkü herhangi bir zamanda yeni özellikler ortaya çıkabilir ve bir şeyleri kırabilir .. Her durumda, ipuçlarını kullanarak ve dikkatlice bu ekstra özelliklerin hepsiyle alay ederek cevap olarak işaretlenir. Teşekkürler bayım! –