2012-06-21 15 views
10

Bir dosyayı bir dosya akışı ile alay etmeye çalışıyorum, ancak bunu başaramadım ve nasıl yapacağımı bilmiyorum, rhino mock kullanıyorum.Bir FileStream Kullanarak Alay Etme

private Connection LoadConnectionDetailsFromDisk(string bodyFile) 
{  
    //logic before 
    using (FileStream fs = File.Open(bodyFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
    return this.serverConfiguration.LoadConfiguration(fs, flowProcess); 
    } 
    //more logic 
} 

herkes nasıl alay söyler misiniz kullanarak (FileStream ....) bu yüzden bu kod dalı erişebilir miyim?

FileStream o zaman gerçekten her zaman bir ıstream kabul edebilir fantezi almak istiyorsanız size filestream

private Connection LoadConnectionDetailsFromDisk(FileStream bodyFile) 
{ 
    .... 
} 

bir taklidini oluşturabilmeleri yönteme geçti ve böylece ben yöntemi planı ayrı ediyorum

cevap

9

Daha sonra bunun mümkün alaycı çağrısı olacağını bir arayüz yöntemi ile soyut File.Open() gerekiyor.

Yani

1) bir arayüz oluşturun:

public interface IFileDataSource 
{ 
    FileStream Open(string path, 
        FileMode mode, 
        FileAccess access, 
        FileShare share); 
} 

2) şu şekilde LoadConnectionDetailsFromDisk() değiştirin: Bir testte

private Connection LoadConnectionDetailsFromDisk(string path, IFileDataSource fileSource) 
{  
    using (FileStream fs = fileSource.Open(bodyFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
     return this.serverConfiguration.LoadConfiguration(fs, flowProcess); 
    } 

    //more logic 
} 

3) arabirimini alay ve sahte

enjekte
// create a mock instance 
var sourceMock = MockRepository.GenerateMock<IFileDataSource>(); 

// setup expectation 
sourceMock.Expect(m => m.Open("path", FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 
     .CallBack(
delegate (string path, FileMode mode, FileAccess access, FileShare share) 
{ 
     // handle a call 

    return true; 
}).Repeat.Any(); 

// TODO: depends on how you are triggering LoadConnectionDetailsFromDisk method call 
// inject a mock 

LoadConnectionDetailsFromDisk() göz önünde bulundurulduğunda, doğrudan bu yönteme sahte olarak enjekte edemezsiniz froma testini çağırın, bu nedenle lütfen bu yöntemin nasıl kullanıldığını gösterin.

0

somut olarak sınıfların Mock IStream ama Rhino destek oluştururken bu mocks

MockRepository mocks = new MockRepository(); 
FileStream basket = mocks.CreateMock<FileStream>(); 
1

Bu amaç için SystemWrapper lib dosyasını kullanabilirsiniz. Sistem sınıflarını sarmalayan arayüzler ve sınıflar içerir ve bu sınıfları kullanarak birim test yöntemlerini kullanmanızı sağlar.