SORU
24 EKİM 2009, CUMARTESİ


MVVM deseni ile OpenFileDialog WPF?

Ben sadece WPF için MVVM desen öğrenmeye başladı. Bir duvara çarptım:bir OpenFileDialog göstermek için ihtiyacınız olduğunda ne yaparsınız?

İşte bir örnek üzerinde kullanmaya çalışıyorum UI:

alt text

Gözat düğmesine tıklandığında, bir OpenFileDialog gösterilmeli. Kullanıcı OpenFileDialog bir dosya seçtiğinde, dosya yolu metin içinde gösterilmelidir.

Nasıl MVVM ile bunu yapabilir miyim?

GüncellemeNasıl MVVM ile bunu yapmak ve birim test yapmak mümkün olabilir miyim? Çözüm aşağıda birim testi için çalışmıyor.

CEVAP
26 EKİM 2009, PAZARTESİ


Ben genellikle ne bu işlevi gerçekleştiren bir uygulama hizmet için bir arayüz oluşturmak. Benim örneklerde MVVM Toolkit ya da benzer bir şey temel bir ViewModel ve bir RelayCommand alabilirim yani () gibi bir şey kullandığınızı varsayıyorum.

Burada OpenFileDialog ve OpenFile gibi temel G / Ç işlemlerini yapmak için son derece basit bir arayüz örneği. Sana bir yöntem ile bir arayüz oluşturmak bu sorunu aşmanın diyorum sence yani hem burada onlara gösteriyorum.

public interface IOService
{
     string OpenFileDialog(string defaultPath);

     //Other similar untestable IO operations
     Stream OpenFile(string path);
}

Uygulamada, bu hizmet varsayılan bir uygulama sağlamak. Onu tüketmek olur.

public MyViewModel : ViewModel
{
     private string _selectedPath;
     public string SelectedPath
     {
          get { return _selectedPath; }
          set { _selectedPath = value; OnPropertyChanged("SelectedPath"); }
     }

     private RelayCommand _openCommand;
     public RelayCommand OpenCommand
     {
          //You know the drill.
          ...
     }

     private IOService _ioService;
     public MyViewModel(IOService ioService)
     {
          _ioService = ioService;
          OpenCommand = new RelayCommand(OpenFile);
     }

     private void OpenFile()
     {
          SelectedPath = _ioService.OpenFileDialog(@"c:\Where\My\File\Usually\Is.txt");
          if(SelectedPath == null)
          {
               SelectedPath = string.Empty;
          }
     }
}

Bu oldukça basit. Son bölüm: test edilebilir. Bu açık olmalı, ama bunun için basit bir test yapmak için nasıl size göstereceğim. Stubbing için Adedi kullanıyorum, ama tabii ki istediğiniz herhangi bir yöntemi kullanabilirsiniz.

[Test]
public void OpenFileCommand_UserSelectsInvalidPath_SelectedPathSetToEmpty()
{
     Mock<IOService> ioServiceStub = new Mock<IOService>();

     //We use null to indicate invalid path in our implementation
     ioServiceStub.Setup(ioServ => ioServ.OpenFileDialog(It.IsAny<string>()))
                  .Returns(null);

     //Setup target and test
     MyViewModel target = new MyViewModel(ioServiceStub.Object);
     target.OpenCommand.Execute();

     Assert.IsEqual(string.Empty, target.SelectedPath);
}

Bu muhtemelen sizin için çalışacak.

Diğer "SystemWrapper" (http://systemwrapper.codeplex.com) bunu yapmak zorunda sizi kurtarabilir . adlı bir kütüphane vardır ^em>çokbu tür bir şey. FileDialog henüz desteklenmiyor gibi görünüyor, bunun için kesinlikle bir arabirim yazmak Zorundasınız.

Bu yardımcı olur umarım.

Edit:

Seni hatırlamak için numara ortamı için TypeMock İzolatör lehine gibi görünüyor. İşte aynı testi İzolatör kullanarak:

[Test]
[Isolated]
public void OpenFileCommand_UserSelectsInvalidPath_SelectedPathSetToEmpty()
{
    IOService ioServiceStub = Isolate.Fake.Instance<IOService>();

    //Setup stub arrangements
    Isolate.WhenCalled(() => ioServiceStub.OpenFileDialog("blah"))
           .WasCalledWithAnyArguments()
           .WillReturn(null);

     //Setup target and test
     MyViewModel target = new MyViewModel(ioServiceStub);
     target.OpenCommand.Execute();

     Assert.IsEqual(string.Empty, target.SelectedPath);
}

Bu hem yararlı umut.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 0TACTICAL0HIPPY0

    0TACTICAL0HI

    30 EYLÜL 2012
  • Goran Dimov

    Goran Dimov

    1 HAZİRAN 2014
  • MrSuicideSheep

    MrSuicideShe

    9 NİSAN 2010